Built with Alectryon, running Coq+SerAPI v8.15.0+0.15.0. Bubbles () indicate interactive fragments: hover for details, tap to reveal contents. Use Ctrl+↑ Ctrl+↓ to navigate, Ctrl+🖱️ to focus. On Mac, use instead of Ctrl.
From Coq Require Import ssreflect ssrfun ssrbool.

From Coq.Logic Require Import FunctionalExtensionality PropExtensionality Classical_Pred_Type Classical_Prop.
From Coq.micromega Require Import Lia.
From Coq.Program Require Import Wf.

From Equations Require Import Equations.

New coercion path [Bool.Is_true] : bool >-> Sortclass is ambiguous with existing [is_true] : bool >-> Sortclass. [ambiguous-paths,typechecker]
New coercion path [Is_true] : bool >-> Sortclass is ambiguous with existing [is_true] : bool >-> Sortclass. [ambiguous-paths,typechecker]
New coercion path [Is_true] : bool >-> Sortclass is ambiguous with existing [is_true] : bool >-> Sortclass. [ambiguous-paths,typechecker]
From MatchingLogic.Utils Require Import Lattice stdpp_ext extralibrary. From MatchingLogic Require Import Syntax Freshness NamedAxioms IndexManipulation . Import MatchingLogic.Syntax.Notations. Import MatchingLogic.Substitution.Notations. (** ** Matching Logic Semantics *) Section semantics. Context {signature : Signature}. Open Scope ml_scope. (* Model of AML ref. snapshot: Definition 2 *) Polymorphic Cumulative Record Model := { Domain :> Type; Domain_inhabited :> Inhabited Domain; app_interp : Domain -> Domain -> propset Domain; sym_interp (sigma : symbols) : propset Domain; }. Section with_model. Context {M : Model}. Definition Empty : propset (Domain M) := @empty (propset (Domain M)) _. Definition Full : propset (Domain M) := @top (propset (Domain M)) _. (* full set and empty set are distinct *)
signature: Signature
M: Model

S : propset M, S = Empty → S ≠ Full
signature: Signature
M: Model

S : propset M, S = Empty → S ≠ Full
signature: Signature
M: Model
S: propset M
H: S = Empty

S ≠ Full
signature: Signature
M: Model
S: propset M
H: S = Empty
HContra: S = Full

False
signature: Signature
M: Model
S: propset M
H: Full = Empty
HContra: S = Full

False
signature: Signature
M: Model
S: propset M
H: Full = Empty
HContra: S = Full

inhabitant ∈ Full
signature: Signature
M: Model
S: propset M
H: Full = Empty
HContra: S = Full
Hw1: inhabitant ∈ Full
False
signature: Signature
M: Model
S: propset M
H: Full = Empty
HContra: S = Full

inhabitant ∈ Full
signature: Signature
M: Model
S: propset M
H: Full = Empty
HContra: S = Full

inhabitant ∈ ⊤
signature: Signature
M: Model
S: propset M
H: Full = Empty
HContra: S = Full

True
exact I.
signature: Signature
M: Model
S: propset M
H: Full = Empty
HContra: S = Full
Hw1: inhabitant ∈ Full

False
signature: Signature
M: Model
S: propset M
H: Full = Empty
HContra: S = Full
Hw1: inhabitant ∈ Empty

False
signature: Signature
M: Model
S: propset M
H: Full = Empty
HContra: S = Full
Hw1: inhabitant ∈ ∅

False
signature: Signature
M: Model
S: propset M
H: Full = Empty
HContra: S = Full
Hw1: False

False
exact Hw1. Qed.
signature: Signature
M: Model

S : propset M, S = Full → S ≠ Empty
signature: Signature
M: Model

S : propset M, S = Full → S ≠ Empty
signature: Signature
M: Model
S: propset M
H: S = Full
HContra: S = Empty

False
signature: Signature
M: Model
S: propset M
H: Empty = Full
HContra: S = Empty

False
signature: Signature
M: Model
S: propset M
H: Empty = Full
HContra: S = Empty

inhabitant ∈ Full
signature: Signature
M: Model
S: propset M
H: Empty = Full
HContra: S = Empty
Hw1: inhabitant ∈ Full
False
signature: Signature
M: Model
S: propset M
H: Empty = Full
HContra: S = Empty

inhabitant ∈ Full
signature: Signature
M: Model
S: propset M
H: Empty = Full
HContra: S = Empty

inhabitant ∈ ⊤
signature: Signature
M: Model
S: propset M
H: Empty = Full
HContra: S = Empty

True
exact I.
signature: Signature
M: Model
S: propset M
H: Empty = Full
HContra: S = Empty
Hw1: inhabitant ∈ Full

False
signature: Signature
M: Model
S: propset M
H: Empty = Full
HContra: S = Empty
Hw1: inhabitant ∈ Empty

False
signature: Signature
M: Model
S: propset M
H: Empty = Full
HContra: S = Empty
Hw1: inhabitant ∈ ∅

False
signature: Signature
M: Model
S: propset M
H: Empty = Full
HContra: S = Empty
Hw1: False

False
exact Hw1. Qed. (* element and set variable valuations *) Polymorphic Record Valuation : Type := mkValuation { evar_valuation : evar -> Domain M ; svar_valuation : svar -> propset (Domain M) ; }. Definition update_evar_val (ev : evar) (x : Domain M) (val : Valuation) : Valuation := {| evar_valuation := fun ev' : evar => if decide (ev = ev') is left _ then x else evar_valuation val ev' ; svar_valuation := (svar_valuation val) |}. Definition update_svar_val (sv : svar) (X : propset (Domain M)) (val : Valuation) : Valuation := {| evar_valuation := (evar_valuation val); svar_valuation := fun sv' : svar => if decide (sv = sv') is left _ then X else svar_valuation val sv' ; |}.
signature: Signature
M: Model
ev: evar
x: M
sv: svar
X: propset M
ρ: Valuation

update_evar_val ev x (update_svar_val sv X ρ) = update_svar_val sv X (update_evar_val ev x ρ)
signature: Signature
M: Model
ev: evar
x: M
sv: svar
X: propset M
ρ: Valuation

update_evar_val ev x (update_svar_val sv X ρ) = update_svar_val sv X (update_evar_val ev x ρ)
signature: Signature
M: Model
ev: evar
x: M
sv: svar
X: propset M
ρ: Valuation

{| evar_valuation := λ ev' : evar, if decide (ev = ev') then x else evar_valuation {| evar_valuation := evar_valuation ρ; svar_valuation := λ sv' : svar, if decide (sv = sv') then X else svar_valuation ρ sv' |} ev'; svar_valuation := svar_valuation {| evar_valuation := evar_valuation ρ; svar_valuation := λ sv' : svar, if decide (sv = sv') then X else svar_valuation ρ sv' |} |} = {| evar_valuation := evar_valuation {| evar_valuation := λ ev' : evar, if decide (ev = ev') then x else evar_valuation ρ ev'; svar_valuation := svar_valuation ρ |}; svar_valuation := λ sv' : svar, if decide (sv = sv') then X else svar_valuation {| evar_valuation := λ ev' : evar, if decide (ev = ev') then x else evar_valuation ρ ev'; svar_valuation := svar_valuation ρ |} sv' |}
signature: Signature
M: Model
ev: evar
x: M
sv: svar
X: propset M
ρ: Valuation

{| evar_valuation := λ ev' : evar, if decide (ev = ev') then x else evar_valuation ρ ev'; svar_valuation := λ sv' : svar, if decide (sv = sv') then X else svar_valuation ρ sv' |} = {| evar_valuation := λ ev' : evar, if decide (ev = ev') then x else evar_valuation ρ ev'; svar_valuation := λ sv' : svar, if decide (sv = sv') then X else svar_valuation ρ sv' |}
reflexivity. Qed.
signature: Signature
M: Model

(X1 X2 : svar) (S1 S2 : propset M) (ρ : Valuation), X1 ≠ X2 → update_svar_val X1 S1 (update_svar_val X2 S2 ρ) = update_svar_val X2 S2 (update_svar_val X1 S1 ρ)
signature: Signature
M: Model

(X1 X2 : svar) (S1 S2 : propset M) (ρ : Valuation), X1 ≠ X2 → update_svar_val X1 S1 (update_svar_val X2 S2 ρ) = update_svar_val X2 S2 (update_svar_val X1 S1 ρ)
signature: Signature
M: Model
X1, X2: svar
S1, S2: propset M
ρ: Valuation
H: X1 ≠ X2

update_svar_val X1 S1 (update_svar_val X2 S2 ρ) = update_svar_val X2 S2 (update_svar_val X1 S1 ρ)
signature: Signature
M: Model
X1, X2: svar
S1, S2: propset M
ρ: Valuation
H: X1 ≠ X2

{| evar_valuation := evar_valuation {| evar_valuation := evar_valuation ρ; svar_valuation := λ sv' : svar, if decide (X2 = sv') then S2 else svar_valuation ρ sv' |}; svar_valuation := λ sv' : svar, if decide (X1 = sv') then S1 else svar_valuation {| evar_valuation := evar_valuation ρ; svar_valuation := λ sv'0 : svar, if decide (X2 = sv'0) then S2 else svar_valuation ρ sv'0 |} sv' |} = {| evar_valuation := evar_valuation {| evar_valuation := evar_valuation ρ; svar_valuation := λ sv' : svar, if decide (X1 = sv') then S1 else svar_valuation ρ sv' |}; svar_valuation := λ sv' : svar, if decide (X2 = sv') then S2 else svar_valuation {| evar_valuation := evar_valuation ρ; svar_valuation := λ sv'0 : svar, if decide (X1 = sv'0) then S1 else svar_valuation ρ sv'0 |} sv' |}
signature: Signature
M: Model
X1, X2: svar
S1, S2: propset M
ρ: Valuation
H: X1 ≠ X2

{| evar_valuation := evar_valuation ρ; svar_valuation := λ sv' : svar, if decide (X1 = sv') then S1 else if decide (X2 = sv') then S2 else svar_valuation ρ sv' |} = {| evar_valuation := evar_valuation ρ; svar_valuation := λ sv' : svar, if decide (X2 = sv') then S2 else if decide (X1 = sv') then S1 else svar_valuation ρ sv' |}
signature: Signature
M: Model
X1, X2: svar
S1, S2: propset M
ρ: Valuation
H: X1 ≠ X2

(λ sv' : svar, if decide (X1 = sv') then S1 else if decide (X2 = sv') then S2 else svar_valuation ρ sv') = (λ sv' : svar, if decide (X2 = sv') then S2 else if decide (X1 = sv') then S1 else svar_valuation ρ sv')
signature: Signature
M: Model
X1, X2: svar
S1, S2: propset M
ρ: Valuation
H: X1 ≠ X2

x : svar, (if decide (X1 = x) then S1 else if decide (X2 = x) then S2 else svar_valuation ρ x) = (if decide (X2 = x) then S2 else if decide (X1 = x) then S1 else svar_valuation ρ x)
signature: Signature
M: Model
X1, X2: svar
S1, S2: propset M
ρ: Valuation
H: X1 ≠ X2
x: svar

(if decide (X1 = x) then S1 else if decide (X2 = x) then S2 else svar_valuation ρ x) = (if decide (X2 = x) then S2 else if decide (X1 = x) then S1 else svar_valuation ρ x)
signature: Signature
M: Model
S1, S2: propset M
ρ: Valuation
x: svar
H: x ≠ x

S1 = S2
signature: Signature
M: Model
X2: svar
S1, S2: propset M
ρ: Valuation
x: svar
H: x ≠ X2
n: X2 ≠ x
S1 = S1
signature: Signature
M: Model
X1: svar
S1, S2: propset M
ρ: Valuation
x: svar
H, n: X1 ≠ x
S2 = S2
signature: Signature
M: Model
X1, X2: svar
S1, S2: propset M
ρ: Valuation
H: X1 ≠ X2
x: svar
n: X1 ≠ x
n0: X2 ≠ x
svar_valuation ρ x = svar_valuation ρ x
signature: Signature
M: Model
S1, S2: propset M
ρ: Valuation
x: svar
H: x ≠ x

S1 = S2
signature: Signature
M: Model
S1, S2: propset M
ρ: Valuation
x: svar
H: x = x → False

S1 = S2
signature: Signature
M: Model
S1, S2: propset M
ρ: Valuation
x: svar
H: x = x → False

x = x
signature: Signature
M: Model
S1, S2: propset M
ρ: Valuation
x: svar
H: x = x → False
H0: x = x
S1 = S2
signature: Signature
M: Model
S1, S2: propset M
ρ: Valuation
x: svar
H: x = x → False
H0: x = x

S1 = S2
signature: Signature
M: Model
S1, S2: propset M
ρ: Valuation
x: svar
H: x = x → False
H0: False

S1 = S2
destruct H0.
signature: Signature
M: Model
X2: svar
S1, S2: propset M
ρ: Valuation
x: svar
H: x ≠ X2
n: X2 ≠ x

S1 = S1
reflexivity.
signature: Signature
M: Model
X1: svar
S1, S2: propset M
ρ: Valuation
x: svar
H, n: X1 ≠ x

S2 = S2
reflexivity.
signature: Signature
M: Model
X1, X2: svar
S1, S2: propset M
ρ: Valuation
H: X1 ≠ X2
x: svar
n: X1 ≠ x
n0: X2 ≠ x

svar_valuation ρ x = svar_valuation ρ x
reflexivity. Qed.
signature: Signature
M: Model

(X : svar) (S1 S2 : propset M) (ρ : Valuation), update_svar_val X S1 (update_svar_val X S2 ρ) = update_svar_val X S1 ρ
signature: Signature
M: Model

(X : svar) (S1 S2 : propset M) (ρ : Valuation), update_svar_val X S1 (update_svar_val X S2 ρ) = update_svar_val X S1 ρ
signature: Signature
M: Model
X: svar
S1, S2: propset M
ρ: Valuation

update_svar_val X S1 (update_svar_val X S2 ρ) = update_svar_val X S1 ρ
signature: Signature
M: Model
X: svar
S1, S2: propset M
ρ: Valuation

{| evar_valuation := evar_valuation {| evar_valuation := evar_valuation ρ; svar_valuation := λ sv' : svar, if decide (X = sv') then S2 else svar_valuation ρ sv' |}; svar_valuation := λ sv' : svar, if decide (X = sv') then S1 else svar_valuation {| evar_valuation := evar_valuation ρ; svar_valuation := λ sv'0 : svar, if decide (X = sv'0) then S2 else svar_valuation ρ sv'0 |} sv' |} = {| evar_valuation := evar_valuation ρ; svar_valuation := λ sv' : svar, if decide (X = sv') then S1 else svar_valuation ρ sv' |}
signature: Signature
M: Model
X: svar
S1, S2: propset M
ρ: Valuation

{| evar_valuation := evar_valuation ρ; svar_valuation := λ sv' : svar, if decide (X = sv') then S1 else if decide (X = sv') then S2 else svar_valuation ρ sv' |} = {| evar_valuation := evar_valuation ρ; svar_valuation := λ sv' : svar, if decide (X = sv') then S1 else svar_valuation ρ sv' |}
signature: Signature
M: Model
X: svar
S1, S2: propset M
ρ: Valuation

(λ sv' : svar, if decide (X = sv') then S1 else if decide (X = sv') then S2 else svar_valuation ρ sv') = (λ sv' : svar, if decide (X = sv') then S1 else svar_valuation ρ sv')
signature: Signature
M: Model
X: svar
S1, S2: propset M
ρ: Valuation

x : svar, (if decide (X = x) then S1 else if decide (X = x) then S2 else svar_valuation ρ x) = (if decide (X = x) then S1 else svar_valuation ρ x)
signature: Signature
M: Model
X: svar
S1, S2: propset M
ρ: Valuation
x: svar

(if decide (X = x) then S1 else if decide (X = x) then S2 else svar_valuation ρ x) = (if decide (X = x) then S1 else svar_valuation ρ x)
destruct (decide (X = x)); reflexivity. Qed.
signature: Signature
M: Model
ρ: Valuation
X1: svar
S: propset M
X2: svar

X1 ≠ X2 → svar_valuation (update_svar_val X1 S ρ) X2 = svar_valuation ρ X2
signature: Signature
M: Model
ρ: Valuation
X1: svar
S: propset M
X2: svar

X1 ≠ X2 → svar_valuation (update_svar_val X1 S ρ) X2 = svar_valuation ρ X2
signature: Signature
M: Model
ρ: Valuation
X1: svar
S: propset M
X2: svar

X1 ≠ X2 → svar_valuation {| evar_valuation := evar_valuation ρ; svar_valuation := λ sv' : svar, if decide (X1 = sv') then S else svar_valuation ρ sv' |} X2 = svar_valuation ρ X2
signature: Signature
M: Model
ρ: Valuation
X1: svar
S: propset M
X2: svar
H: X1 ≠ X2

svar_valuation {| evar_valuation := evar_valuation ρ; svar_valuation := λ sv' : svar, if decide (X1 = sv') then S else svar_valuation ρ sv' |} X2 = svar_valuation ρ X2
signature: Signature
M: Model
ρ: Valuation
X1: svar
S: propset M
X2: svar
H: X1 ≠ X2

(if decide (X1 = X2) then S else svar_valuation ρ X2) = svar_valuation ρ X2
signature: Signature
M: Model
ρ: Valuation
X1: svar
S: propset M
X2: svar
H: X1 ≠ X2
e: X1 = X2

S = svar_valuation ρ X2
signature: Signature
M: Model
ρ: Valuation
X1: svar
S: propset M
X2: svar
H, n: X1 ≠ X2
svar_valuation ρ X2 = svar_valuation ρ X2
signature: Signature
M: Model
ρ: Valuation
X1: svar
S: propset M
X2: svar
H: X1 ≠ X2
e: X1 = X2

S = svar_valuation ρ X2
contradiction.
signature: Signature
M: Model
ρ: Valuation
X1: svar
S: propset M
X2: svar
H, n: X1 ≠ X2

svar_valuation ρ X2 = svar_valuation ρ X2
auto. Qed.
signature: Signature
M: Model

(x1 x2 : evar) (m1 m2 : M) (ρ : Valuation), x1 ≠ x2 → update_evar_val x1 m1 (update_evar_val x2 m2 ρ) = update_evar_val x2 m2 (update_evar_val x1 m1 ρ)
signature: Signature
M: Model

(x1 x2 : evar) (m1 m2 : M) (ρ : Valuation), x1 ≠ x2 → update_evar_val x1 m1 (update_evar_val x2 m2 ρ) = update_evar_val x2 m2 (update_evar_val x1 m1 ρ)
signature: Signature
M: Model
x1, x2: evar
m1, m2: M
ρ: Valuation
H: x1 ≠ x2

update_evar_val x1 m1 (update_evar_val x2 m2 ρ) = update_evar_val x2 m2 (update_evar_val x1 m1 ρ)
signature: Signature
M: Model
x1, x2: evar
m1, m2: M
ρ: Valuation
H: x1 ≠ x2

{| evar_valuation := λ ev' : evar, if decide (x1 = ev') then m1 else evar_valuation {| evar_valuation := λ ev'0 : evar, if decide (x2 = ev'0) then m2 else evar_valuation ρ ev'0; svar_valuation := svar_valuation ρ |} ev'; svar_valuation := svar_valuation {| evar_valuation := λ ev' : evar, if decide (x2 = ev') then m2 else evar_valuation ρ ev'; svar_valuation := svar_valuation ρ |} |} = {| evar_valuation := λ ev' : evar, if decide (x2 = ev') then m2 else evar_valuation {| evar_valuation := λ ev'0 : evar, if decide (x1 = ev'0) then m1 else evar_valuation ρ ev'0; svar_valuation := svar_valuation ρ |} ev'; svar_valuation := svar_valuation {| evar_valuation := λ ev' : evar, if decide (x1 = ev') then m1 else evar_valuation ρ ev'; svar_valuation := svar_valuation ρ |} |}
signature: Signature
M: Model
x1, x2: evar
m1, m2: M
ρ: Valuation
H: x1 ≠ x2

{| evar_valuation := λ ev' : evar, if decide (x1 = ev') then m1 else if decide (x2 = ev') then m2 else evar_valuation ρ ev'; svar_valuation := svar_valuation ρ |} = {| evar_valuation := λ ev' : evar, if decide (x2 = ev') then m2 else if decide (x1 = ev') then m1 else evar_valuation ρ ev'; svar_valuation := svar_valuation ρ |}
signature: Signature
M: Model
x1, x2: evar
m1, m2: M
ρ: Valuation
H: x1 ≠ x2

(λ ev' : evar, if decide (x1 = ev') then m1 else if decide (x2 = ev') then m2 else evar_valuation ρ ev') = (λ ev' : evar, if decide (x2 = ev') then m2 else if decide (x1 = ev') then m1 else evar_valuation ρ ev')
signature: Signature
M: Model
x1, x2: evar
m1, m2: M
ρ: Valuation
H: x1 ≠ x2

x : evar, (if decide (x1 = x) then m1 else if decide (x2 = x) then m2 else evar_valuation ρ x) = (if decide (x2 = x) then m2 else if decide (x1 = x) then m1 else evar_valuation ρ x)
signature: Signature
M: Model
x1, x2: evar
m1, m2: M
ρ: Valuation
H: x1 ≠ x2
x: evar

(if decide (x1 = x) then m1 else if decide (x2 = x) then m2 else evar_valuation ρ x) = (if decide (x2 = x) then m2 else if decide (x1 = x) then m1 else evar_valuation ρ x)
signature: Signature
M: Model
m1, m2: M
ρ: Valuation
x: evar
H: x ≠ x

m1 = m2
signature: Signature
M: Model
x2: evar
m1, m2: M
ρ: Valuation
x: evar
H: x ≠ x2
n: x2 ≠ x
m1 = m1
signature: Signature
M: Model
x1: evar
m1, m2: M
ρ: Valuation
x: evar
H, n: x1 ≠ x
m2 = m2
signature: Signature
M: Model
x1, x2: evar
m1, m2: M
ρ: Valuation
H: x1 ≠ x2
x: evar
n: x1 ≠ x
n0: x2 ≠ x
evar_valuation ρ x = evar_valuation ρ x
signature: Signature
M: Model
m1, m2: M
ρ: Valuation
x: evar
H: x ≠ x

m1 = m2
signature: Signature
M: Model
m1, m2: M
ρ: Valuation
x: evar
H: x = x → False

m1 = m2
signature: Signature
M: Model
m1, m2: M
ρ: Valuation
x: evar
H: x = x → False

x = x
signature: Signature
M: Model
m1, m2: M
ρ: Valuation
x: evar
H: x = x → False
H0: x = x
m1 = m2
signature: Signature
M: Model
m1, m2: M
ρ: Valuation
x: evar
H: x = x → False
H0: x = x

m1 = m2
signature: Signature
M: Model
m1, m2: M
ρ: Valuation
x: evar
H: x = x → False
H0: False

m1 = m2
destruct H0.
signature: Signature
M: Model
x2: evar
m1, m2: M
ρ: Valuation
x: evar
H: x ≠ x2
n: x2 ≠ x

m1 = m1
reflexivity.
signature: Signature
M: Model
x1: evar
m1, m2: M
ρ: Valuation
x: evar
H, n: x1 ≠ x

m2 = m2
reflexivity.
signature: Signature
M: Model
x1, x2: evar
m1, m2: M
ρ: Valuation
H: x1 ≠ x2
x: evar
n: x1 ≠ x
n0: x2 ≠ x

evar_valuation ρ x = evar_valuation ρ x
reflexivity. Qed.
signature: Signature
M: Model

(x : evar) (m1 m2 : M) (ρ : Valuation), update_evar_val x m1 (update_evar_val x m2 ρ) = update_evar_val x m1 ρ
signature: Signature
M: Model

(x : evar) (m1 m2 : M) (ρ : Valuation), update_evar_val x m1 (update_evar_val x m2 ρ) = update_evar_val x m1 ρ
signature: Signature
M: Model
x: evar
m1, m2: M
ρ: Valuation

update_evar_val x m1 (update_evar_val x m2 ρ) = update_evar_val x m1 ρ
signature: Signature
M: Model
x: evar
m1, m2: M
ρ: Valuation

{| evar_valuation := λ ev' : evar, if decide (x = ev') then m1 else evar_valuation {| evar_valuation := λ ev'0 : evar, if decide (x = ev'0) then m2 else evar_valuation ρ ev'0; svar_valuation := svar_valuation ρ |} ev'; svar_valuation := svar_valuation {| evar_valuation := λ ev' : evar, if decide (x = ev') then m2 else evar_valuation ρ ev'; svar_valuation := svar_valuation ρ |} |} = {| evar_valuation := λ ev' : evar, if decide (x = ev') then m1 else evar_valuation ρ ev'; svar_valuation := svar_valuation ρ |}
signature: Signature
M: Model
x: evar
m1, m2: M
ρ: Valuation

{| evar_valuation := λ ev' : evar, if decide (x = ev') then m1 else if decide (x = ev') then m2 else evar_valuation ρ ev'; svar_valuation := svar_valuation ρ |} = {| evar_valuation := λ ev' : evar, if decide (x = ev') then m1 else evar_valuation ρ ev'; svar_valuation := svar_valuation ρ |}
signature: Signature
M: Model
x: evar
m1, m2: M
ρ: Valuation

(λ ev' : evar, if decide (x = ev') then m1 else if decide (x = ev') then m2 else evar_valuation ρ ev') = (λ ev' : evar, if decide (x = ev') then m1 else evar_valuation ρ ev')
signature: Signature
M: Model
x: evar
m1, m2: M
ρ: Valuation

x0 : evar, (if decide (x = x0) then m1 else if decide (x = x0) then m2 else evar_valuation ρ x0) = (if decide (x = x0) then m1 else evar_valuation ρ x0)
signature: Signature
M: Model
x: evar
m1, m2: M
ρ: Valuation
x0: evar

(if decide (x = x0) then m1 else if decide (x = x0) then m2 else evar_valuation ρ x0) = (if decide (x = x0) then m1 else evar_valuation ρ x0)
destruct (decide (x = x0)); reflexivity. Qed.
signature: Signature
M: Model
x: evar
m: M
ρ: Valuation

evar_valuation (update_evar_val x m ρ) x = m
signature: Signature
M: Model
x: evar
m: M
ρ: Valuation

evar_valuation (update_evar_val x m ρ) x = m
signature: Signature
M: Model
x: evar
m: M
ρ: Valuation

evar_valuation {| evar_valuation := λ ev' : evar, if decide (x = ev') then m else evar_valuation ρ ev'; svar_valuation := svar_valuation ρ |} x = m
signature: Signature
M: Model
x: evar
m: M
ρ: Valuation

(if decide (x = x) then m else evar_valuation ρ x) = m
signature: Signature
M: Model
x: evar
m: M
ρ: Valuation

m = m
reflexivity. Qed.
signature: Signature
M: Model
ρ: Valuation
x1: evar
e: M
x2: evar

x1 ≠ x2 → evar_valuation (update_evar_val x1 e ρ) x2 = evar_valuation ρ x2
signature: Signature
M: Model
ρ: Valuation
x1: evar
e: M
x2: evar

x1 ≠ x2 → evar_valuation (update_evar_val x1 e ρ) x2 = evar_valuation ρ x2
signature: Signature
M: Model
ρ: Valuation
x1: evar
e: M
x2: evar

x1 ≠ x2 → evar_valuation {| evar_valuation := λ ev' : evar, if decide (x1 = ev') then e else evar_valuation ρ ev'; svar_valuation := svar_valuation ρ |} x2 = evar_valuation ρ x2
signature: Signature
M: Model
ρ: Valuation
x1: evar
e: M
x2: evar

x1 ≠ x2 → (if decide (x1 = x2) then e else evar_valuation ρ x2) = evar_valuation ρ x2
signature: Signature
M: Model
ρ: Valuation
x1: evar
e: M
x2: evar
H: x1 ≠ x2

(if decide (x1 = x2) then e else evar_valuation ρ x2) = evar_valuation ρ x2
signature: Signature
M: Model
ρ: Valuation
x1: evar
e: M
x2: evar
H: x1 ≠ x2
e0: x1 = x2

e = evar_valuation ρ x2
signature: Signature
M: Model
ρ: Valuation
x1: evar
e: M
x2: evar
H, n: x1 ≠ x2
evar_valuation ρ x2 = evar_valuation ρ x2
signature: Signature
M: Model
ρ: Valuation
x1: evar
e: M
x2: evar
H: x1 ≠ x2
e0: x1 = x2

e = evar_valuation ρ x2
contradiction.
signature: Signature
M: Model
ρ: Valuation
x1: evar
e: M
x2: evar
H, n: x1 ≠ x2

evar_valuation ρ x2 = evar_valuation ρ x2
auto. Qed.
signature: Signature
M: Model
x: evar
ρ: Valuation

update_evar_val x (evar_valuation ρ x) ρ = ρ
signature: Signature
M: Model
x: evar
ρ: Valuation

update_evar_val x (evar_valuation ρ x) ρ = ρ
signature: Signature
M: Model
x: evar
ρₑ: evar → M
ρₛ: svar → propset M

update_evar_val x (evar_valuation {| evar_valuation := ρₑ; svar_valuation := ρₛ |} x) {| evar_valuation := ρₑ; svar_valuation := ρₛ |} = {| evar_valuation := ρₑ; svar_valuation := ρₛ |}
signature: Signature
M: Model
x: evar
ρₑ: evar → M
ρₛ: svar → propset M

update_evar_val x (ρₑ x) {| evar_valuation := ρₑ; svar_valuation := ρₛ |} = {| evar_valuation := ρₑ; svar_valuation := ρₛ |}
signature: Signature
M: Model
x: evar
ρₑ: evar → M
ρₛ: svar → propset M

{| evar_valuation := λ ev' : evar, if decide (x = ev') then ρₑ x else evar_valuation {| evar_valuation := ρₑ; svar_valuation := ρₛ |} ev'; svar_valuation := svar_valuation {| evar_valuation := ρₑ; svar_valuation := ρₛ |} |} = {| evar_valuation := ρₑ; svar_valuation := ρₛ |}
signature: Signature
M: Model
x: evar
ρₑ: evar → M
ρₛ: svar → propset M

{| evar_valuation := λ ev' : evar, if decide (x = ev') then ρₑ x else ρₑ ev'; svar_valuation := ρₛ |} = {| evar_valuation := ρₑ; svar_valuation := ρₛ |}
signature: Signature
M: Model
x: evar
ρₑ: evar → M
ρₛ: svar → propset M

(λ ev' : evar, if decide (x = ev') then ρₑ x else ρₑ ev') = ρₑ
signature: Signature
M: Model
x: evar
ρₑ: evar → M
ρₛ: svar → propset M

x0 : evar, (if decide (x = x0) then ρₑ x else ρₑ x0) = ρₑ x0
signature: Signature
M: Model
x: evar
ρₑ: evar → M
ρₛ: svar → propset M
x0: evar

(if decide (x = x0) then ρₑ x else ρₑ x0) = ρₑ x0
signature: Signature
M: Model
x: evar
ρₑ: evar → M
ρₛ: svar → propset M
x0: evar

(if decide (x = x0) then ρₑ x else ρₑ x0) = ρₑ x0
signature: Signature
M: Model
x: evar
ρₑ: evar → M
ρₛ: svar → propset M
x0: evar
e: x = x0

ρₑ x = ρₑ x0
signature: Signature
M: Model
x: evar
ρₑ: evar → M
ρₛ: svar → propset M
x0: evar
n: x ≠ x0
ρₑ x0 = ρₑ x0
signature: Signature
M: Model
x: evar
ρₑ: evar → M
ρₛ: svar → propset M
x0: evar
e: x = x0

ρₑ x = ρₑ x0
signature: Signature
M: Model
ρₑ: evar → M
ρₛ: svar → propset M
x0: evar

ρₑ x0 = ρₑ x0
reflexivity.
signature: Signature
M: Model
x: evar
ρₑ: evar → M
ρₛ: svar → propset M
x0: evar
n: x ≠ x0

ρₑ x0 = ρₑ x0
reflexivity. Qed.
signature: Signature
M: Model
X: svar
S: propset M
ρ: Valuation

svar_valuation (update_svar_val X S ρ) X = S
signature: Signature
M: Model
X: svar
S: propset M
ρ: Valuation

svar_valuation (update_svar_val X S ρ) X = S
signature: Signature
M: Model
X: svar
S: propset M
ρ: Valuation

svar_valuation {| evar_valuation := evar_valuation ρ; svar_valuation := λ sv' : svar, if decide (X = sv') then S else svar_valuation ρ sv' |} X = S
signature: Signature
M: Model
X: svar
S: propset M
ρ: Valuation

(if decide (X = X) then S else svar_valuation ρ X) = S
signature: Signature
M: Model
X: svar
S: propset M
ρ: Valuation
e: X = X

S = S
signature: Signature
M: Model
X: svar
S: propset M
ρ: Valuation
n: X ≠ X
svar_valuation ρ X = S
signature: Signature
M: Model
X: svar
S: propset M
ρ: Valuation
e: X = X

S = S
reflexivity.
signature: Signature
M: Model
X: svar
S: propset M
ρ: Valuation
n: X ≠ X

svar_valuation ρ X = S
contradiction. Qed.
signature: Signature
M: Model
x: svar
ρ: Valuation

update_svar_val x (svar_valuation ρ x) ρ = ρ
signature: Signature
M: Model
x: svar
ρ: Valuation

update_svar_val x (svar_valuation ρ x) ρ = ρ
signature: Signature
M: Model
x: svar
ρₑ: evar → M
ρₛ: svar → propset M

update_svar_val x (svar_valuation {| evar_valuation := ρₑ; svar_valuation := ρₛ |} x) {| evar_valuation := ρₑ; svar_valuation := ρₛ |} = {| evar_valuation := ρₑ; svar_valuation := ρₛ |}
signature: Signature
M: Model
x: svar
ρₑ: evar → M
ρₛ: svar → propset M

update_svar_val x (ρₛ x) {| evar_valuation := ρₑ; svar_valuation := ρₛ |} = {| evar_valuation := ρₑ; svar_valuation := ρₛ |}
signature: Signature
M: Model
x: svar
ρₑ: evar → M
ρₛ: svar → propset M

{| evar_valuation := evar_valuation {| evar_valuation := ρₑ; svar_valuation := ρₛ |}; svar_valuation := λ sv' : svar, if decide (x = sv') then ρₛ x else svar_valuation {| evar_valuation := ρₑ; svar_valuation := ρₛ |} sv' |} = {| evar_valuation := ρₑ; svar_valuation := ρₛ |}
signature: Signature
M: Model
x: svar
ρₑ: evar → M
ρₛ: svar → propset M

{| evar_valuation := ρₑ; svar_valuation := λ sv' : svar, if decide (x = sv') then ρₛ x else ρₛ sv' |} = {| evar_valuation := ρₑ; svar_valuation := ρₛ |}
signature: Signature
M: Model
x: svar
ρₑ: evar → M
ρₛ: svar → propset M

(λ sv' : svar, if decide (x = sv') then ρₛ x else ρₛ sv') = ρₛ
signature: Signature
M: Model
x: svar
ρₑ: evar → M
ρₛ: svar → propset M

x0 : svar, (if decide (x = x0) then ρₛ x else ρₛ x0) = ρₛ x0
signature: Signature
M: Model
x: svar
ρₑ: evar → M
ρₛ: svar → propset M
x0: svar

(if decide (x = x0) then ρₛ x else ρₛ x0) = ρₛ x0
signature: Signature
M: Model
x: svar
ρₑ: evar → M
ρₛ: svar → propset M
x0: svar

(if decide (x = x0) then ρₛ x else ρₛ x0) = ρₛ x0
signature: Signature
M: Model
x: svar
ρₑ: evar → M
ρₛ: svar → propset M
x0: svar
e: x = x0

ρₛ x = ρₛ x0
signature: Signature
M: Model
x: svar
ρₑ: evar → M
ρₛ: svar → propset M
x0: svar
n: x ≠ x0
ρₛ x0 = ρₛ x0
signature: Signature
M: Model
x: svar
ρₑ: evar → M
ρₛ: svar → propset M
x0: svar
e: x = x0

ρₛ x = ρₛ x0
signature: Signature
M: Model
ρₑ: evar → M
ρₛ: svar → propset M
x0: svar

ρₛ x0 = ρₛ x0
reflexivity.
signature: Signature
M: Model
x: svar
ρₑ: evar → M
ρₛ: svar → propset M
x0: svar
n: x ≠ x0

ρₛ x0 = ρₛ x0
reflexivity. Qed. (* We use propositional extensionality here. *)
signature: Signature
M: Model

LeibnizEquiv (propset M)
signature: Signature
M: Model

LeibnizEquiv (propset M)
signature: Signature
M: Model
x, y: propset M
H: x ≡ y

x = y
signature: Signature
M: Model
x, y: propset M
H: set_equiv_instance x y

x = y
signature: Signature
M: Model
x, y: propset M
H: x0 : M, x0 ∈ x ↔ x0 ∈ y

x = y
signature: Signature
M: Model
propset_car, propset_car0: M → Prop
H: x : M, x ∈ {[ x | propset_car x ]} ↔ x ∈ {[ x | propset_car0 x ]}

{[ x | propset_car x ]} = {[ x | propset_car0 x ]}
signature: Signature
M: Model
propset_car, propset_car0: M → Prop
H: x : M, x ∈ {[ x | propset_car x ]} ↔ x ∈ {[ x | propset_car0 x ]}

propset_car = propset_car0
signature: Signature
M: Model
propset_car, propset_car0: M → Prop
H: x : M, x ∈ {[ x | propset_car x ]} ↔ x ∈ {[ x | propset_car0 x ]}

x : M, propset_car x = propset_car0 x
signature: Signature
M: Model
propset_car, propset_car0: M → Prop
H: x : M, x ∈ {[ x | propset_car x ]} ↔ x ∈ {[ x | propset_car0 x ]}
x: M

propset_car x = propset_car0 x
signature: Signature
M: Model
propset_car, propset_car0: M → Prop
H: x : M, x ∈ {[ x | propset_car x ]} ↔ x ∈ {[ x | propset_car0 x ]}
x: M

propset_car x ↔ propset_car0 x
signature: Signature
M: Model
propset_car, propset_car0: M → Prop
x: M
H: x ∈ {[ x | propset_car x ]} ↔ x ∈ {[ x | propset_car0 x ]}

propset_car x ↔ propset_car0 x
signature: Signature
M: Model
propset_car, propset_car0: M → Prop
x: M
H1: x ∈ {[ x | propset_car x ]} → x ∈ {[ x | propset_car0 x ]}
H2: x ∈ {[ x | propset_car0 x ]} → x ∈ {[ x | propset_car x ]}

propset_car x ↔ propset_car0 x
split; auto. Qed. (* extending pointwise application *) Polymorphic Definition app_ext (l r : propset (Domain M)) : propset (Domain M) := PropSet (fun (e : (Domain M)) => exists (le re : (Domain M)), le ∈ l /\ re ∈ r /\ e ∈ (app_interp _) le re).
signature: Signature
M: Model

S : propset M, app_ext S ∅ = ∅
signature: Signature
M: Model

S : propset M, app_ext S ∅ = ∅
signature: Signature
M: Model
S: propset M

app_ext S ∅ = ∅
signature: Signature
M: Model
S: propset M

{[ e | le re : M, le ∈ S ∧ re ∈ ∅ ∧ e ∈ app_interp M le re ]} = ∅
signature: Signature
M: Model
S: propset M

x : M, x ∉ {[ e | le re : M, le ∈ S ∧ re ∈ ∅ ∧ e ∈ app_interp M le re ]}
signature: Signature
M: Model
S: propset M
x: M
Hcontra: x ∈ {[ e | le re : M, le ∈ S ∧ re ∈ ∅ ∧ e ∈ app_interp M le re ]}

False
signature: Signature
M: Model
S: propset M
x: M
Hcontra: le re : M, le ∈ S ∧ re ∈ ∅ ∧ x ∈ app_interp M le re

False
signature: Signature
M: Model
S: propset M
x, le, re: M
H1: le ∈ S
H2: re ∈ ∅
H3: x ∈ app_interp M le re

False
signature: Signature
M: Model
S: propset M
x, le, re: M
H1: le ∈ S
H2: False
H3: x ∈ app_interp M le re

False
exact H2. Qed.
signature: Signature
M: Model

S : propset M, app_ext ∅ S = ∅
signature: Signature
M: Model

S : propset M, app_ext ∅ S = ∅
signature: Signature
M: Model
S: propset M

app_ext ∅ S = ∅
signature: Signature
M: Model
S: propset M

{[ e | le re : M, le ∈ ∅ ∧ re ∈ S ∧ e ∈ app_interp M le re ]} = ∅
signature: Signature
M: Model
S: propset M

x : M, x ∉ {[ e | le re : M, le ∈ ∅ ∧ re ∈ S ∧ e ∈ app_interp M le re ]}
signature: Signature
M: Model
S: propset M
x: M
Hcontra: x ∈ {[ e | le re : M, le ∈ ∅ ∧ re ∈ S ∧ e ∈ app_interp M le re ]}

False
signature: Signature
M: Model
S: propset M
x: M
Hcontra: le re : M, le ∈ ∅ ∧ re ∈ S ∧ x ∈ app_interp M le re

False
signature: Signature
M: Model
S: propset M
x, le, re: M
H1: le ∈ ∅
H2: re ∈ S
H3: x ∈ app_interp M le re

False
signature: Signature
M: Model
S: propset M
x, le, re: M
H1: False
H2: re ∈ S
H3: x ∈ app_interp M le re

False
exact H1. Qed.
signature: Signature
M: Model

S1 S2 S : propset M, S1 ⊆ S2 → app_ext S1 S ⊆ app_ext S2 S
signature: Signature
M: Model

S1 S2 S : propset M, S1 ⊆ S2 → app_ext S1 S ⊆ app_ext S2 S
signature: Signature
M: Model
S1, S2, S: propset M
H: S1 ⊆ S2

app_ext S1 S ⊆ app_ext S2 S
signature: Signature
M: Model
S1, S2, S: propset M
H: x : M, x ∈ S1 → x ∈ S2

app_ext S1 S ⊆ app_ext S2 S
signature: Signature
M: Model
S1, S2, S: propset M
H: x : M, x ∈ S1 → x ∈ S2

x : M, x ∈ app_ext S1 S → x ∈ app_ext S2 S
signature: Signature
M: Model
S1, S2, S: propset M
H: x : M, x ∈ S1 → x ∈ S2
x: M
H': x ∈ app_ext S1 S

x ∈ app_ext S2 S
signature: Signature
M: Model
S1, S2, S: propset M
H: x : M, x ∈ S1 → x ∈ S2
x: M
H': x ∈ {[ e | le re : M, le ∈ S1 ∧ re ∈ S ∧ e ∈ app_interp M le re ]}

x ∈ app_ext S2 S
signature: Signature
M: Model
S1, S2, S: propset M
H: x : M, x ∈ S1 → x ∈ S2
x: M
H': le re : M, le ∈ S1 ∧ re ∈ S ∧ x ∈ app_interp M le re

x ∈ app_ext S2 S
signature: Signature
M: Model
S1, S2, S: propset M
H: x : M, x ∈ S1 → x ∈ S2
x, le, re: M
H1: le ∈ S1
H2: re ∈ S
H3: x ∈ app_interp M le re

x ∈ app_ext S2 S
signature: Signature
M: Model
S1, S2, S: propset M
H: x : M, x ∈ S1 → x ∈ S2
x, le, re: M
H1: le ∈ S1
H2: re ∈ S
H3: x ∈ app_interp M le re

x ∈ {[ e | le re : M, le ∈ S2 ∧ re ∈ S ∧ e ∈ app_interp M le re ]}
signature: Signature
M: Model
S1, S2, S: propset M
H: x : M, x ∈ S1 → x ∈ S2
x, le, re: M
H1: le ∈ S1
H2: re ∈ S
H3: x ∈ app_interp M le re

le re : M, le ∈ S2 ∧ re ∈ S ∧ x ∈ app_interp M le re
signature: Signature
M: Model
S1, S2, S: propset M
H: x : M, x ∈ S1 → x ∈ S2
x, le, re: M
H1: le ∈ S1
H2: re ∈ S
H3: x ∈ app_interp M le re

le ∈ S2 ∧ re ∈ S ∧ x ∈ app_interp M le re
firstorder. Qed.
signature: Signature
M: Model

S S1 S2 : propset M, S1 ⊆ S2 → app_ext S S1 ⊆ app_ext S S2
signature: Signature
M: Model

S S1 S2 : propset M, S1 ⊆ S2 → app_ext S S1 ⊆ app_ext S S2
signature: Signature
M: Model
S1, S2, S: propset M
H: S2 ⊆ S

app_ext S1 S2 ⊆ app_ext S1 S
signature: Signature
M: Model
S1, S2, S: propset M
H: x : M, x ∈ S2 → x ∈ S

app_ext S1 S2 ⊆ app_ext S1 S
signature: Signature
M: Model
S1, S2, S: propset M
H: x : M, x ∈ S2 → x ∈ S

x : M, x ∈ app_ext S1 S2 → x ∈ app_ext S1 S
signature: Signature
M: Model
S1, S2, S: propset M
H: x : M, x ∈ S2 → x ∈ S
x: M
H': x ∈ app_ext S1 S2

x ∈ app_ext S1 S
signature: Signature
M: Model
S1, S2, S: propset M
H: x : M, x ∈ S2 → x ∈ S
x: M
H': x ∈ {[ e | le re : M, le ∈ S1 ∧ re ∈ S2 ∧ e ∈ app_interp M le re ]}

x ∈ app_ext S1 S
signature: Signature
M: Model
S1, S2, S: propset M
H: x : M, x ∈ S2 → x ∈ S
x: M
H': le re : M, le ∈ S1 ∧ re ∈ S2 ∧ x ∈ app_interp M le re

x ∈ app_ext S1 S
signature: Signature
M: Model
S1, S2, S: propset M
H: x : M, x ∈ S2 → x ∈ S
x, le, re: M
H1: le ∈ S1
H2: re ∈ S2
H3: x ∈ app_interp M le re

x ∈ app_ext S1 S
signature: Signature
M: Model
S1, S2, S: propset M
H: x : M, x ∈ S2 → x ∈ S
x, le, re: M
H1: le ∈ S1
H2: re ∈ S2
H3: x ∈ app_interp M le re

x ∈ {[ e | le re : M, le ∈ S1 ∧ re ∈ S ∧ e ∈ app_interp M le re ]}
signature: Signature
M: Model
S1, S2, S: propset M
H: x : M, x ∈ S2 → x ∈ S
x, le, re: M
H1: le ∈ S1
H2: re ∈ S2
H3: x ∈ app_interp M le re

le re : M, le ∈ S1 ∧ re ∈ S ∧ x ∈ app_interp M le re
signature: Signature
M: Model
S1, S2, S: propset M
H: x : M, x ∈ S2 → x ∈ S
x, le, re: M
H1: le ∈ S1
H2: re ∈ S2
H3: x ∈ app_interp M le re

le ∈ S1 ∧ re ∈ S ∧ x ∈ app_interp M le re
firstorder. Qed. (* Semantics of AML ref. snapshot: Definition 3 *) Let OS := PropsetOrderedSet (Domain M). Let L := PowersetLattice (Domain M).
signature: Signature
M: Model
OS:= PropsetOrderedSet M: OrderedSet (propset M)
L:= PowersetLattice M: CompleteLattice (propset M)
ρ: Valuation
ϕ₁, ϕ₂: Pattern
eval: Valuation → x0 : Pattern, size x0 < size (ϕ₁ $ ϕ₂) → propset M

size ϕ₁ < size (ϕ₁ $ ϕ₂)
signature: Signature
M: Model
OS:= PropsetOrderedSet M: OrderedSet (propset M)
L:= PowersetLattice M: CompleteLattice (propset M)
ρ: Valuation
ϕ₁, ϕ₂: Pattern
eval: Valuation → x0 : Pattern, size x0 < size (ϕ₁ $ ϕ₂) → propset M
size ϕ₂ < size (ϕ₁ $ ϕ₂)
signature: Signature
M: Model
OS:= PropsetOrderedSet M: OrderedSet (propset M)
L:= PowersetLattice M: CompleteLattice (propset M)
ρ: Valuation
ϕ₁, ϕ₂: Pattern
eval: Valuation → x0 : Pattern, size x0 < size (ϕ₁ ---> ϕ₂) → propset M
size ϕ₁ < size (ϕ₁ ---> ϕ₂)
signature: Signature
M: Model
OS:= PropsetOrderedSet M: OrderedSet (propset M)
L:= PowersetLattice M: CompleteLattice (propset M)
ρ: Valuation
ϕ₁, ϕ₂: Pattern
eval: Valuation → x0 : Pattern, size x0 < size (ϕ₁ ---> ϕ₂) → propset M
size ϕ₂ < size (ϕ₁ ---> ϕ₂)
signature: Signature
M: Model
OS:= PropsetOrderedSet M: OrderedSet (propset M)
L:= PowersetLattice M: CompleteLattice (propset M)
ρ: Valuation
ϕ': Pattern
eval: Valuation → x0 : Pattern, size x0 < size (ex , ϕ') → propset M
x:= fresh_evar ϕ': evar
e: M
ρ':= update_evar_val x e ρ: Valuation
size ϕ'^{evar:0↦x} < size (ex , ϕ')
signature: Signature
M: Model
OS:= PropsetOrderedSet M: OrderedSet (propset M)
L:= PowersetLattice M: CompleteLattice (propset M)
ρ: Valuation
ϕ': Pattern
eval: Valuation → x0 : Pattern, size x0 < size (mu , ϕ') → propset M
X:= fresh_svar ϕ': svar
S: propset M
ρ':= update_svar_val X S ρ: Valuation
size ϕ'^{svar:0↦X} < size (mu , ϕ')
signature: Signature
M: Model
OS:= PropsetOrderedSet M: OrderedSet (propset M)
L:= PowersetLattice M: CompleteLattice (propset M)
ρ: Valuation
ϕ₁, ϕ₂: Pattern
eval: Valuation → x0 : Pattern, size x0 < size (ϕ₁ $ ϕ₂) → propset M

size ϕ₁ < size (ϕ₁ $ ϕ₂)
signature: Signature
M: Model
OS:= PropsetOrderedSet M: OrderedSet (propset M)
L:= PowersetLattice M: CompleteLattice (propset M)
ρ: Valuation
ϕ₁, ϕ₂: Pattern
eval: Valuation → x0 : Pattern, size x0 < size (ϕ₁ $ ϕ₂) → propset M
size ϕ₂ < size (ϕ₁ $ ϕ₂)
signature: Signature
M: Model
OS:= PropsetOrderedSet M: OrderedSet (propset M)
L:= PowersetLattice M: CompleteLattice (propset M)
ρ: Valuation
ϕ₁, ϕ₂: Pattern
eval: Valuation → x0 : Pattern, size x0 < size (ϕ₁ ---> ϕ₂) → propset M
size ϕ₁ < size (ϕ₁ ---> ϕ₂)
signature: Signature
M: Model
OS:= PropsetOrderedSet M: OrderedSet (propset M)
L:= PowersetLattice M: CompleteLattice (propset M)
ρ: Valuation
ϕ₁, ϕ₂: Pattern
eval: Valuation → x0 : Pattern, size x0 < size (ϕ₁ ---> ϕ₂) → propset M
size ϕ₂ < size (ϕ₁ ---> ϕ₂)
signature: Signature
M: Model
OS:= PropsetOrderedSet M: OrderedSet (propset M)
L:= PowersetLattice M: CompleteLattice (propset M)
ρ: Valuation
ϕ': Pattern
eval: Valuation → x0 : Pattern, size x0 < size (ex , ϕ') → propset M
x:= fresh_evar ϕ': evar
e: M
ρ':= update_evar_val x e ρ: Valuation
size ϕ'^{evar:0↦x} < size (ex , ϕ')
signature: Signature
M: Model
OS:= PropsetOrderedSet M: OrderedSet (propset M)
L:= PowersetLattice M: CompleteLattice (propset M)
ρ: Valuation
ϕ': Pattern
eval: Valuation → x0 : Pattern, size x0 < size (mu , ϕ') → propset M
X:= fresh_svar ϕ': svar
S: propset M
ρ':= update_svar_val X S ρ: Valuation
size ϕ'^{svar:0↦X} < size (mu , ϕ')
signature: Signature
M: Model
OS:= PropsetOrderedSet M: OrderedSet (propset M)
L:= PowersetLattice M: CompleteLattice (propset M)
ρ: Valuation
ϕ': Pattern
eval: Valuation → x0 : Pattern, size x0 < size (ex , ϕ') → propset M
x:= fresh_evar ϕ': evar
e: M
ρ':= update_evar_val x e ρ: Valuation

size ϕ'^{evar:0↦x} < S (size ϕ')
signature: Signature
M: Model
OS:= PropsetOrderedSet M: OrderedSet (propset M)
L:= PowersetLattice M: CompleteLattice (propset M)
ρ: Valuation
ϕ': Pattern
eval: Valuation → x0 : Pattern, size x0 < size (mu , ϕ') → propset M
X:= fresh_svar ϕ': svar
S: propset M
ρ':= update_svar_val X S ρ: Valuation
size ϕ'^{svar:0↦X} < Datatypes.S (size ϕ')
signature: Signature
M: Model
OS:= PropsetOrderedSet M: OrderedSet (propset M)
L:= PowersetLattice M: CompleteLattice (propset M)
ρ: Valuation
ϕ': Pattern
eval: Valuation → x0 : Pattern, size x0 < size (ex , ϕ') → propset M
x:= fresh_evar ϕ': evar
e: M
ρ':= update_evar_val x e ρ: Valuation

size ϕ'^{evar:0↦x} < S (size ϕ')
signature: Signature
M: Model
OS:= PropsetOrderedSet M: OrderedSet (propset M)
L:= PowersetLattice M: CompleteLattice (propset M)
ρ: Valuation
ϕ': Pattern
eval: Valuation → x0 : Pattern, size x0 < size (ex , ϕ') → propset M
x:= fresh_evar ϕ': evar
e: M
ρ':= update_evar_val x e ρ: Valuation

size ϕ' < S (size ϕ')
lia.
signature: Signature
M: Model
OS:= PropsetOrderedSet M: OrderedSet (propset M)
L:= PowersetLattice M: CompleteLattice (propset M)
ρ: Valuation
ϕ': Pattern
eval: Valuation → x0 : Pattern, size x0 < size (mu , ϕ') → propset M
X:= fresh_svar ϕ': svar
S: propset M
ρ':= update_svar_val X S ρ: Valuation

size ϕ'^{svar:0↦X} < Datatypes.S (size ϕ')
signature: Signature
M: Model
OS:= PropsetOrderedSet M: OrderedSet (propset M)
L:= PowersetLattice M: CompleteLattice (propset M)
ρ: Valuation
ϕ': Pattern
eval: Valuation → x0 : Pattern, size x0 < size (mu , ϕ') → propset M
X:= fresh_svar ϕ': svar
S: propset M
ρ':= update_svar_val X S ρ: Valuation

size ϕ'^{svar:0↦X} < Datatypes.S (size ϕ')
signature: Signature
M: Model
OS:= PropsetOrderedSet M: OrderedSet (propset M)
L:= PowersetLattice M: CompleteLattice (propset M)
ρ: Valuation
ϕ': Pattern
eval: Valuation → x0 : Pattern, size x0 < size (mu , ϕ') → propset M
X:= fresh_svar ϕ': svar
S: propset M
ρ':= update_svar_val X S ρ: Valuation

size ϕ' < Datatypes.S (size ϕ')
lia. } Defined. Definition Fassoc ρ ϕ X := λ S, eval (update_svar_val X S ρ) ϕ.
signature: Signature
M: Model
OS:= PropsetOrderedSet M: OrderedSet (propset M)
L:= PowersetLattice M: CompleteLattice (propset M)
ρ: Valuation
x: evar

eval ρ (patt_free_evar x) = {[evar_valuation ρ x]}
signature: Signature
M: Model
OS:= PropsetOrderedSet M: OrderedSet (propset M)
L:= PowersetLattice M: CompleteLattice (propset M)
ρ: Valuation
x: evar

eval ρ (patt_free_evar x) = {[evar_valuation ρ x]}
signature: Signature
M: Model
OS:= PropsetOrderedSet M: OrderedSet (propset M)
L:= PowersetLattice M: CompleteLattice (propset M)
ρ: Valuation
x: evar

{[evar_valuation ρ x]} = {[evar_valuation ρ x]}
reflexivity. Qed.
signature: Signature
M: Model
OS:= PropsetOrderedSet M: OrderedSet (propset M)
L:= PowersetLattice M: CompleteLattice (propset M)
ρ: Valuation
X: svar

eval ρ (patt_free_svar X) = svar_valuation ρ X
signature: Signature
M: Model
OS:= PropsetOrderedSet M: OrderedSet (propset M)
L:= PowersetLattice M: CompleteLattice (propset M)
ρ: Valuation
X: svar

eval ρ (patt_free_svar X) = svar_valuation ρ X
signature: Signature
M: Model
OS:= PropsetOrderedSet M: OrderedSet (propset M)
L:= PowersetLattice M: CompleteLattice (propset M)
ρ: Valuation
X: svar

svar_valuation ρ X = svar_valuation ρ X
reflexivity. Qed.
signature: Signature
M: Model
OS:= PropsetOrderedSet M: OrderedSet (propset M)
L:= PowersetLattice M: CompleteLattice (propset M)
ρ: Valuation
x: db_index

eval ρ (patt_bound_evar x) = ∅
signature: Signature
M: Model
OS:= PropsetOrderedSet M: OrderedSet (propset M)
L:= PowersetLattice M: CompleteLattice (propset M)
ρ: Valuation
x: db_index

eval ρ (patt_bound_evar x) = ∅
signature: Signature
M: Model
OS:= PropsetOrderedSet M: OrderedSet (propset M)
L:= PowersetLattice M: CompleteLattice (propset M)
ρ: Valuation
x: db_index

∅ = ∅
reflexivity. Qed.
signature: Signature
M: Model
OS:= PropsetOrderedSet M: OrderedSet (propset M)
L:= PowersetLattice M: CompleteLattice (propset M)
ρ: Valuation
X: db_index

eval ρ (patt_bound_svar X) = ∅
signature: Signature
M: Model
OS:= PropsetOrderedSet M: OrderedSet (propset M)
L:= PowersetLattice M: CompleteLattice (propset M)
ρ: Valuation
X: db_index

eval ρ (patt_bound_svar X) = ∅
signature: Signature
M: Model
OS:= PropsetOrderedSet M: OrderedSet (propset M)
L:= PowersetLattice M: CompleteLattice (propset M)
ρ: Valuation
X: db_index

∅ = ∅
reflexivity. Qed.
signature: Signature
M: Model
OS:= PropsetOrderedSet M: OrderedSet (propset M)
L:= PowersetLattice M: CompleteLattice (propset M)
ρ: Valuation
s: symbols

eval ρ (patt_sym s) = sym_interp M s
signature: Signature
M: Model
OS:= PropsetOrderedSet M: OrderedSet (propset M)
L:= PowersetLattice M: CompleteLattice (propset M)
ρ: Valuation
s: symbols

eval ρ (patt_sym s) = sym_interp M s
signature: Signature
M: Model
OS:= PropsetOrderedSet M: OrderedSet (propset M)
L:= PowersetLattice M: CompleteLattice (propset M)
ρ: Valuation
s: symbols

sym_interp M s = sym_interp M s
reflexivity. Qed.
signature: Signature
M: Model
OS:= PropsetOrderedSet M: OrderedSet (propset M)
L:= PowersetLattice M: CompleteLattice (propset M)
ρ: Valuation
ϕ₁, ϕ₂: Pattern

eval ρ (ϕ₁ $ ϕ₂) = app_ext (eval ρ ϕ₁) (eval ρ ϕ₂)
signature: Signature
M: Model
OS:= PropsetOrderedSet M: OrderedSet (propset M)
L:= PowersetLattice M: CompleteLattice (propset M)
ρ: Valuation
ϕ₁, ϕ₂: Pattern

eval ρ (ϕ₁ $ ϕ₂) = app_ext (eval ρ ϕ₁) (eval ρ ϕ₂)
signature: Signature
M: Model
OS:= PropsetOrderedSet M: OrderedSet (propset M)
L:= PowersetLattice M: CompleteLattice (propset M)
ρ: Valuation
ϕ₁, ϕ₂: Pattern

app_ext (eval ρ ϕ₁) (eval ρ ϕ₂) = app_ext (eval ρ ϕ₁) (eval ρ ϕ₂)
reflexivity. Qed.
signature: Signature
M: Model
OS:= PropsetOrderedSet M: OrderedSet (propset M)
L:= PowersetLattice M: CompleteLattice (propset M)
ρ: Valuation

eval ρ ⊥ = ∅
signature: Signature
M: Model
OS:= PropsetOrderedSet M: OrderedSet (propset M)
L:= PowersetLattice M: CompleteLattice (propset M)
ρ: Valuation

eval ρ ⊥ = ∅
signature: Signature
M: Model
OS:= PropsetOrderedSet M: OrderedSet (propset M)
L:= PowersetLattice M: CompleteLattice (propset M)
ρ: Valuation

∅ = ∅
reflexivity. Qed.
signature: Signature
M: Model
OS:= PropsetOrderedSet M: OrderedSet (propset M)
L:= PowersetLattice M: CompleteLattice (propset M)
ρ: Valuation
ϕ₁, ϕ₂: Pattern

eval ρ (ϕ₁ ---> ϕ₂) = ⊤ ∖ eval ρ ϕ₁ ∪ eval ρ ϕ₂
signature: Signature
M: Model
OS:= PropsetOrderedSet M: OrderedSet (propset M)
L:= PowersetLattice M: CompleteLattice (propset M)
ρ: Valuation
ϕ₁, ϕ₂: Pattern

eval ρ (ϕ₁ ---> ϕ₂) = ⊤ ∖ eval ρ ϕ₁ ∪ eval ρ ϕ₂
signature: Signature
M: Model
OS:= PropsetOrderedSet M: OrderedSet (propset M)
L:= PowersetLattice M: CompleteLattice (propset M)
ρ: Valuation
ϕ₁, ϕ₂: Pattern

⊤ ∖ eval ρ ϕ₁ ∪ eval ρ ϕ₂ = ⊤ ∖ eval ρ ϕ₁ ∪ eval ρ ϕ₂
reflexivity. Qed.
signature: Signature
M: Model
OS:= PropsetOrderedSet M: OrderedSet (propset M)
L:= PowersetLattice M: CompleteLattice (propset M)
ρ: Valuation
ϕ': Pattern

eval ρ (ex , ϕ') = (let x := fresh_evar ϕ' in propset_fa_union (λ e : M, let ρ' := update_evar_val x e ρ in eval ρ' ϕ'^{evar:0↦x}))
signature: Signature
M: Model
OS:= PropsetOrderedSet M: OrderedSet (propset M)
L:= PowersetLattice M: CompleteLattice (propset M)
ρ: Valuation
ϕ': Pattern

eval ρ (ex , ϕ') = (let x := fresh_evar ϕ' in propset_fa_union (λ e : M, let ρ' := update_evar_val x e ρ in eval ρ' ϕ'^{evar:0↦x}))
signature: Signature
M: Model
OS:= PropsetOrderedSet M: OrderedSet (propset M)
L:= PowersetLattice M: CompleteLattice (propset M)
ρ: Valuation
ϕ': Pattern

(let x := fresh_evar ϕ' in propset_fa_union (λ e : M, let ρ' := update_evar_val x e ρ in eval ρ' ϕ'^{evar:0↦x})) = (let x := fresh_evar ϕ' in propset_fa_union (λ e : M, let ρ' := update_evar_val x e ρ in eval ρ' ϕ'^{evar:0↦x}))
reflexivity. Qed.
signature: Signature
M: Model
OS:= PropsetOrderedSet M: OrderedSet (propset M)
L:= PowersetLattice M: CompleteLattice (propset M)
ρ: Valuation
ϕ': Pattern

eval ρ (mu , ϕ') = (let X := fresh_svar ϕ' in LeastFixpointOf (λ S : propset M, let ρ' := update_svar_val X S ρ in eval ρ' ϕ'^{svar:0↦X}))
signature: Signature
M: Model
OS:= PropsetOrderedSet M: OrderedSet (propset M)
L:= PowersetLattice M: CompleteLattice (propset M)
ρ: Valuation
ϕ': Pattern

eval ρ (mu , ϕ') = (let X := fresh_svar ϕ' in LeastFixpointOf (λ S : propset M, let ρ' := update_svar_val X S ρ in eval ρ' ϕ'^{svar:0↦X}))
signature: Signature
M: Model
OS:= PropsetOrderedSet M: OrderedSet (propset M)
L:= PowersetLattice M: CompleteLattice (propset M)
ρ: Valuation
ϕ': Pattern

(let X := fresh_svar ϕ' in LeastFixpointOf (λ S : propset M, let ρ' := update_svar_val X S ρ in eval ρ' ϕ'^{svar:0↦X})) = (let X := fresh_svar ϕ' in LeastFixpointOf (λ S : propset M, let ρ' := update_svar_val X S ρ in eval ρ' ϕ'^{svar:0↦X}))
reflexivity. Qed. (* TODO extend with derived constructs using typeclasses *) Definition eval_simpl := ( eval_free_evar_simpl, eval_free_svar_simpl, eval_bound_evar_simpl, eval_bound_svar_simpl, eval_sym_simpl, eval_app_simpl, eval_bott_simpl, eval_imp_simpl, eval_ex_simpl, eval_mu_simpl ). End with_model. Section with_explicit_model. Context (M : Model). (* Model predicate. Useful mainly if the pattern is well-formed. *) Definition M_predicate (ϕ : Pattern) : Prop := forall ρ, @eval M ρ ϕ = ⊤ \/ eval ρ ϕ = ∅.
signature: Signature
M: Model
ϕ₁, ϕ₂: Pattern

M_predicate ϕ₁ → M_predicate ϕ₂ → M_predicate (ϕ₁ ---> ϕ₂)
signature: Signature
M: Model
ϕ₁, ϕ₂: Pattern

M_predicate ϕ₁ → M_predicate ϕ₂ → M_predicate (ϕ₁ ---> ϕ₂)
signature: Signature
M: Model
ϕ₁, ϕ₂: Pattern

( ρ : Valuation, eval ρ ϕ₁ = ⊤ ∨ eval ρ ϕ₁ = ∅) → ( ρ : Valuation, eval ρ ϕ₂ = ⊤ ∨ eval ρ ϕ₂ = ∅) → ρ : Valuation, eval ρ (ϕ₁ ---> ϕ₂) = ⊤ ∨ eval ρ (ϕ₁ ---> ϕ₂) = ∅
signature: Signature
M: Model
ϕ₁, ϕ₂: Pattern
Hp1: ρ : Valuation, eval ρ ϕ₁ = ⊤ ∨ eval ρ ϕ₁ = ∅
Hp2: ρ : Valuation, eval ρ ϕ₂ = ⊤ ∨ eval ρ ϕ₂ = ∅
ρ: Valuation

eval ρ (ϕ₁ ---> ϕ₂) = ⊤ ∨ eval ρ (ϕ₁ ---> ϕ₂) = ∅
signature: Signature
M: Model
ϕ₁, ϕ₂: Pattern
ρ: Valuation
Hp1: eval ρ ϕ₁ = ⊤ ∨ eval ρ ϕ₁ = ∅
Hp2: ρ : Valuation, eval ρ ϕ₂ = ⊤ ∨ eval ρ ϕ₂ = ∅

eval ρ (ϕ₁ ---> ϕ₂) = ⊤ ∨ eval ρ (ϕ₁ ---> ϕ₂) = ∅
signature: Signature
M: Model
ϕ₁, ϕ₂: Pattern
ρ: Valuation
Hp1: eval ρ ϕ₁ = ⊤ ∨ eval ρ ϕ₁ = ∅
Hp2: eval ρ ϕ₂ = ⊤ ∨ eval ρ ϕ₂ = ∅

eval ρ (ϕ₁ ---> ϕ₂) = ⊤ ∨ eval ρ (ϕ₁ ---> ϕ₂) = ∅
signature: Signature
M: Model
ϕ₁, ϕ₂: Pattern
ρ: Valuation
Hp1: eval ρ ϕ₁ = ⊤ ∨ eval ρ ϕ₁ = ∅
Hp2: eval ρ ϕ₂ = ⊤ ∨ eval ρ ϕ₂ = ∅

⊤ ∖ eval ρ ϕ₁ ∪ eval ρ ϕ₂ = ⊤ ∨ ⊤ ∖ eval ρ ϕ₁ ∪ eval ρ ϕ₂ = ∅
signature: Signature
M: Model
ϕ₁, ϕ₂: Pattern
ρ: Valuation
H: eval ρ ϕ₁ = ⊤
H0: eval ρ ϕ₂ = ⊤

⊤ ∖ ⊤ ∪ ⊤ = ⊤ ∨ ⊤ ∖ ⊤ ∪ ⊤ = ∅
signature: Signature
M: Model
ϕ₁, ϕ₂: Pattern
ρ: Valuation
H: eval ρ ϕ₁ = ⊤
H0: eval ρ ϕ₂ = ∅
⊤ ∖ ⊤ ∪ ∅ = ⊤ ∨ ⊤ ∖ ⊤ ∪ ∅ = ∅
signature: Signature
M: Model
ϕ₁, ϕ₂: Pattern
ρ: Valuation
H: eval ρ ϕ₁ = ∅
H0: eval ρ ϕ₂ = ⊤
⊤ ∖ ∅ ∪ ⊤ = ⊤ ∨ ⊤ ∖ ∅ ∪ ⊤ = ∅
signature: Signature
M: Model
ϕ₁, ϕ₂: Pattern
ρ: Valuation
H: eval ρ ϕ₁ = ∅
H0: eval ρ ϕ₂ = ∅
⊤ ∖ ∅ ∪ ∅ = ⊤ ∨ ⊤ ∖ ∅ ∪ ∅ = ∅
signature: Signature
M: Model
ϕ₁, ϕ₂: Pattern
ρ: Valuation
H: eval ρ ϕ₁ = ⊤
H0: eval ρ ϕ₂ = ⊤

⊤ ∖ ⊤ ∪ ⊤ = ⊤ ∨ ⊤ ∖ ⊤ ∪ ⊤ = ∅
signature: Signature
M: Model
ϕ₁, ϕ₂: Pattern
ρ: Valuation
H: eval ρ ϕ₁ = ⊤
H0: eval ρ ϕ₂ = ⊤

⊤ ∖ ⊤ ∪ ⊤ = ⊤
set_solver by fail.
signature: Signature
M: Model
ϕ₁, ϕ₂: Pattern
ρ: Valuation
H: eval ρ ϕ₁ = ⊤
H0: eval ρ ϕ₂ = ∅

⊤ ∖ ⊤ ∪ ∅ = ⊤ ∨ ⊤ ∖ ⊤ ∪ ∅ = ∅
signature: Signature
M: Model
ϕ₁, ϕ₂: Pattern
ρ: Valuation
H: eval ρ ϕ₁ = ⊤
H0: eval ρ ϕ₂ = ∅

⊤ ∖ ⊤ ∪ ∅ = ∅
set_solver by fail.
signature: Signature
M: Model
ϕ₁, ϕ₂: Pattern
ρ: Valuation
H: eval ρ ϕ₁ = ∅
H0: eval ρ ϕ₂ = ⊤

⊤ ∖ ∅ ∪ ⊤ = ⊤ ∨ ⊤ ∖ ∅ ∪ ⊤ = ∅
signature: Signature
M: Model
ϕ₁, ϕ₂: Pattern
ρ: Valuation
H: eval ρ ϕ₁ = ∅
H0: eval ρ ϕ₂ = ⊤

⊤ ∖ ∅ ∪ ⊤ = ⊤
set_solver by fail.
signature: Signature
M: Model
ϕ₁, ϕ₂: Pattern
ρ: Valuation
H: eval ρ ϕ₁ = ∅
H0: eval ρ ϕ₂ = ∅

⊤ ∖ ∅ ∪ ∅ = ⊤ ∨ ⊤ ∖ ∅ ∪ ∅ = ∅
signature: Signature
M: Model
ϕ₁, ϕ₂: Pattern
ρ: Valuation
H: eval ρ ϕ₁ = ∅
H0: eval ρ ϕ₂ = ∅

⊤ ∖ ∅ ∪ ∅ = ⊤
set_solver by fail. Qed. Hint Resolve M_predicate_impl : core.
signature: Signature
M: Model

M_predicate ⊥
signature: Signature
M: Model

M_predicate ⊥
signature: Signature
M: Model

ρ : Valuation, eval ρ ⊥ = ⊤ ∨ eval ρ ⊥ = ∅
signature: Signature
M: Model
ρ: Valuation

eval ρ ⊥ = ⊤ ∨ eval ρ ⊥ = ∅
signature: Signature
M: Model
ρ: Valuation

eval ρ ⊥ = ∅
apply eval_bott_simpl. Qed. Hint Resolve M_predicate_bott : core.
signature: Signature
M: Model
ϕ: Pattern

let x := evar_fresh (elements (free_evars ϕ)) in M_predicate ϕ^{evar:0↦x} → M_predicate (ex , ϕ)
signature: Signature
M: Model
ϕ: Pattern

let x := evar_fresh (elements (free_evars ϕ)) in M_predicate ϕ^{evar:0↦x} → M_predicate (ex , ϕ)
signature: Signature
M: Model
ϕ: Pattern

M_predicate ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} → M_predicate (ex , ϕ)
signature: Signature
M: Model
ϕ: Pattern

( ρ : Valuation, eval ρ ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ⊤ ∨ eval ρ ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ∅) → ρ : Valuation, eval ρ (ex , ϕ) = ⊤ ∨ eval ρ (ex , ϕ) = ∅
signature: Signature
M: Model
ϕ: Pattern
H: ρ : Valuation, eval ρ ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ⊤ ∨ eval ρ ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ∅
ρ: Valuation

eval ρ (ex , ϕ) = ⊤ ∨ eval ρ (ex , ϕ) = ∅
signature: Signature
M: Model
ϕ: Pattern
H: ρ : Valuation, eval ρ ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ⊤ ∨ eval ρ ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ∅
ρ: Valuation

(let x := fresh_evar ϕ in propset_fa_union (λ e : M, let ρ' := update_evar_val x e ρ in eval ρ' ϕ^{evar:0↦x})) = ⊤ ∨ (let x := fresh_evar ϕ in propset_fa_union (λ e : M, let ρ' := update_evar_val x e ρ in eval ρ' ϕ^{evar:0↦x})) = ∅
signature: Signature
M: Model
ϕ: Pattern
H: ρ : Valuation, eval ρ ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ⊤ ∨ eval ρ ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ∅
ρ: Valuation

propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ) e ρ) ϕ^{evar:0↦fresh_evar ϕ}) = ⊤ ∨ propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ) e ρ) ϕ^{evar:0↦fresh_evar ϕ}) = ∅
signature: Signature
M: Model
ϕ: Pattern
H: ρ : Valuation, eval ρ ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ⊤ ∨ eval ρ ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ∅
ρ: Valuation
H': ( e : M, eval (update_evar_val (evar_fresh (elements (free_evars ϕ))) e ρ) ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ⊤) ∨ ¬ ( e : M, eval (update_evar_val (evar_fresh (elements (free_evars ϕ))) e ρ) ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ⊤)

propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ) e ρ) ϕ^{evar:0↦fresh_evar ϕ}) = ⊤ ∨ propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ) e ρ) ϕ^{evar:0↦fresh_evar ϕ}) = ∅
signature: Signature
M: Model
ϕ: Pattern
H: ρ : Valuation, eval ρ ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ⊤ ∨ eval ρ ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ∅
ρ: Valuation
H0: e : M, eval (update_evar_val (evar_fresh (elements (free_evars ϕ))) e ρ) ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ⊤

propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ) e ρ) ϕ^{evar:0↦fresh_evar ϕ}) = ⊤ ∨ propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ) e ρ) ϕ^{evar:0↦fresh_evar ϕ}) = ∅
signature: Signature
M: Model
ϕ: Pattern
H: ρ : Valuation, eval ρ ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ⊤ ∨ eval ρ ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ∅
ρ: Valuation
H0: ¬ ( e : M, eval (update_evar_val (evar_fresh (elements (free_evars ϕ))) e ρ) ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ⊤)
propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ) e ρ) ϕ^{evar:0↦fresh_evar ϕ}) = ⊤ ∨ propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ) e ρ) ϕ^{evar:0↦fresh_evar ϕ}) = ∅
signature: Signature
M: Model
ϕ: Pattern
H: ρ : Valuation, eval ρ ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ⊤ ∨ eval ρ ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ∅
ρ: Valuation
H0: e : M, eval (update_evar_val (evar_fresh (elements (free_evars ϕ))) e ρ) ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ⊤

propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ) e ρ) ϕ^{evar:0↦fresh_evar ϕ}) = ⊤ ∨ propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ) e ρ) ϕ^{evar:0↦fresh_evar ϕ}) = ∅
signature: Signature
M: Model
ϕ: Pattern
H: ρ : Valuation, eval ρ ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ⊤ ∨ eval ρ ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ∅
ρ: Valuation
H0: e : M, eval (update_evar_val (evar_fresh (elements (free_evars ϕ))) e ρ) ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ⊤

propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ) e ρ) ϕ^{evar:0↦fresh_evar ϕ}) = ⊤
signature: Signature
M: Model
ϕ: Pattern
H: ρ : Valuation, eval ρ ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ⊤ ∨ eval ρ ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ∅
ρ: Valuation
H0: e : M, eval (update_evar_val (evar_fresh (elements (free_evars ϕ))) e ρ) ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ⊤

propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ) e ρ) ϕ^{evar:0↦fresh_evar ϕ}) ⊆ ⊤ ⊆ propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ) e ρ) ϕ^{evar:0↦fresh_evar ϕ})
signature: Signature
M: Model
ϕ: Pattern
H: ρ : Valuation, eval ρ ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ⊤ ∨ eval ρ ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ∅
ρ: Valuation
H0: e : M, eval (update_evar_val (evar_fresh (elements (free_evars ϕ))) e ρ) ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ⊤

propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ) e ρ) ϕ^{evar:0↦fresh_evar ϕ}) ⊆ ⊤
signature: Signature
M: Model
ϕ: Pattern
H: ρ : Valuation, eval ρ ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ⊤ ∨ eval ρ ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ∅
ρ: Valuation
H0: e : M, eval (update_evar_val (evar_fresh (elements (free_evars ϕ))) e ρ) ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ⊤
⊤ ⊆ propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ) e ρ) ϕ^{evar:0↦fresh_evar ϕ})
signature: Signature
M: Model
ϕ: Pattern
H: ρ : Valuation, eval ρ ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ⊤ ∨ eval ρ ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ∅
ρ: Valuation
H0: e : M, eval (update_evar_val (evar_fresh (elements (free_evars ϕ))) e ρ) ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ⊤

propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ) e ρ) ϕ^{evar:0↦fresh_evar ϕ}) ⊆ ⊤
set_solver by fail.
signature: Signature
M: Model
ϕ: Pattern
H: ρ : Valuation, eval ρ ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ⊤ ∨ eval ρ ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ∅
ρ: Valuation
H0: e : M, eval (update_evar_val (evar_fresh (elements (free_evars ϕ))) e ρ) ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ⊤

⊤ ⊆ propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ) e ρ) ϕ^{evar:0↦fresh_evar ϕ})
signature: Signature
M: Model
ϕ: Pattern
H: ρ : Valuation, eval ρ ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ⊤ ∨ eval ρ ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ∅
ρ: Valuation
H0: e : M, eval (update_evar_val (evar_fresh (elements (free_evars ϕ))) e ρ) ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ⊤

x : M, x ∈ ⊤ → x ∈ propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ) e ρ) ϕ^{evar:0↦fresh_evar ϕ})
signature: Signature
M: Model
ϕ: Pattern
H: ρ : Valuation, eval ρ ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ⊤ ∨ eval ρ ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ∅
ρ: Valuation
H0: e : M, eval (update_evar_val (evar_fresh (elements (free_evars ϕ))) e ρ) ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ⊤
x: M

x ∈ propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ) e ρ) ϕ^{evar:0↦fresh_evar ϕ})
signature: Signature
M: Model
ϕ: Pattern
H: ρ : Valuation, eval ρ ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ⊤ ∨ eval ρ ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ∅
ρ: Valuation
x0: M
H0: eval (update_evar_val (evar_fresh (elements (free_evars ϕ))) x0 ρ) ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ⊤
x: M

x ∈ propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ) e ρ) ϕ^{evar:0↦fresh_evar ϕ})
signature: Signature
M: Model
ϕ: Pattern
H: ρ : Valuation, eval ρ ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ⊤ ∨ eval ρ ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ∅
ρ: Valuation
x0: M
H0: eval (update_evar_val (evar_fresh (elements (free_evars ϕ))) x0 ρ) ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ⊤
x: M

x ∈ propset_fa_union (λ e : M, eval (update_evar_val (evar_fresh_s (free_evars ϕ)) e ρ) ϕ^{evar:0↦evar_fresh_s (free_evars ϕ)})
signature: Signature
M: Model
ϕ: Pattern
H: ρ : Valuation, eval ρ ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ⊤ ∨ eval ρ ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ∅
ρ: Valuation
x0: M
H0: eval (update_evar_val (evar_fresh (elements (free_evars ϕ))) x0 ρ) ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ⊤
x: M

x ∈ {[ x | c : M, x ∈ eval (update_evar_val (evar_fresh_s (free_evars ϕ)) c ρ) ϕ^{evar:0↦evar_fresh_s (free_evars ϕ)} ]}
signature: Signature
M: Model
ϕ: Pattern
H: ρ : Valuation, eval ρ ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ⊤ ∨ eval ρ ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ∅
ρ: Valuation
x0: M
H0: eval (update_evar_val (evar_fresh (elements (free_evars ϕ))) x0 ρ) ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ⊤
x: M

c : M, x ∈ eval (update_evar_val (evar_fresh_s (free_evars ϕ)) c ρ) ϕ^{evar:0↦evar_fresh_s (free_evars ϕ)}
signature: Signature
M: Model
ϕ: Pattern
H: ρ : Valuation, eval ρ ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ⊤ ∨ eval ρ ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ∅
ρ: Valuation
x0: M
H0: eval (update_evar_val (evar_fresh (elements (free_evars ϕ))) x0 ρ) ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ⊤
x: M

x ∈ eval (update_evar_val (evar_fresh_s (free_evars ϕ)) x0 ρ) ϕ^{evar:0↦evar_fresh_s (free_evars ϕ)}
signature: Signature
M: Model
ϕ: Pattern
H: ρ : Valuation, eval ρ ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ⊤ ∨ eval ρ ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ∅
ρ: Valuation
x0: M
H0: eval (update_evar_val (evar_fresh (elements (free_evars ϕ))) x0 ρ) ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ⊤
x: M

x ∈ ⊤
apply elem_of_top'.
signature: Signature
M: Model
ϕ: Pattern
H: ρ : Valuation, eval ρ ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ⊤ ∨ eval ρ ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ∅
ρ: Valuation
H0: ¬ ( e : M, eval (update_evar_val (evar_fresh (elements (free_evars ϕ))) e ρ) ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ⊤)

propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ) e ρ) ϕ^{evar:0↦fresh_evar ϕ}) = ⊤ ∨ propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ) e ρ) ϕ^{evar:0↦fresh_evar ϕ}) = ∅
signature: Signature
M: Model
ϕ: Pattern
H: ρ : Valuation, eval ρ ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ⊤ ∨ eval ρ ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ∅
ρ: Valuation
H0: ¬ ( e : M, eval (update_evar_val (evar_fresh (elements (free_evars ϕ))) e ρ) ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ⊤)

propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ) e ρ) ϕ^{evar:0↦fresh_evar ϕ}) = ∅
signature: Signature
M: Model
ϕ: Pattern
H: ρ : Valuation, eval ρ ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ⊤ ∨ eval ρ ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ∅
ρ: Valuation
H0: ¬ ( e : M, eval (update_evar_val (evar_fresh (elements (free_evars ϕ))) e ρ) ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ⊤)

propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ) e ρ) ϕ^{evar:0↦fresh_evar ϕ}) ⊆ ∅ ⊆ propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ) e ρ) ϕ^{evar:0↦fresh_evar ϕ})
signature: Signature
M: Model
ϕ: Pattern
H: ρ : Valuation, eval ρ ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ⊤ ∨ eval ρ ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ∅
ρ: Valuation
H0: ¬ ( e : M, eval (update_evar_val (evar_fresh (elements (free_evars ϕ))) e ρ) ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ⊤)

propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ) e ρ) ϕ^{evar:0↦fresh_evar ϕ}) ⊆ ∅
signature: Signature
M: Model
ϕ: Pattern
H: ρ : Valuation, eval ρ ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ⊤ ∨ eval ρ ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ∅
ρ: Valuation
H0: ¬ ( e : M, eval (update_evar_val (evar_fresh (elements (free_evars ϕ))) e ρ) ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ⊤)
∅ ⊆ propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ) e ρ) ϕ^{evar:0↦fresh_evar ϕ})
signature: Signature
M: Model
ϕ: Pattern
H: ρ : Valuation, eval ρ ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ⊤ ∨ eval ρ ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ∅
ρ: Valuation
H0: ¬ ( e : M, eval (update_evar_val (evar_fresh (elements (free_evars ϕ))) e ρ) ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ⊤)

∅ ⊆ propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ) e ρ) ϕ^{evar:0↦fresh_evar ϕ})
apply empty_subseteq.
signature: Signature
M: Model
ϕ: Pattern
H: ρ : Valuation, eval ρ ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ⊤ ∨ eval ρ ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ∅
ρ: Valuation
H0: ¬ ( e : M, eval (update_evar_val (evar_fresh (elements (free_evars ϕ))) e ρ) ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ⊤)

propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ) e ρ) ϕ^{evar:0↦fresh_evar ϕ}) ⊆ ∅
signature: Signature
M: Model
ϕ: Pattern
H: ρ : Valuation, eval ρ ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ⊤ ∨ eval ρ ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ∅
ρ: Valuation
H0: ¬ ( e : M, eval (update_evar_val (evar_fresh (elements (free_evars ϕ))) e ρ) ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ⊤)

x : M, x ∈ propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ) e ρ) ϕ^{evar:0↦fresh_evar ϕ}) → x ∈ ∅
signature: Signature
M: Model
ϕ: Pattern
H: ρ : Valuation, eval ρ ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ⊤ ∨ eval ρ ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ∅
ρ: Valuation
H0: ¬ ( e : M, eval (update_evar_val (evar_fresh (elements (free_evars ϕ))) e ρ) ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ⊤)
x: M
H1: x ∈ propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ) e ρ) ϕ^{evar:0↦fresh_evar ϕ})

x ∈ ∅
signature: Signature
M: Model
ϕ: Pattern
H: ρ : Valuation, eval ρ ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ⊤ ∨ eval ρ ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ∅
ρ: Valuation
H0: ¬ ( e : M, eval (update_evar_val (evar_fresh (elements (free_evars ϕ))) e ρ) ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ⊤)
x: M
H1: x ∈ {[ x | c : M, x ∈ eval (update_evar_val (fresh_evar ϕ) c ρ) ϕ^{evar:0↦ fresh_evar ϕ} ]}

x ∈ ∅
signature: Signature
M: Model
ϕ: Pattern
H: ρ : Valuation, eval ρ ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ⊤ ∨ eval ρ ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ∅
ρ: Valuation
H0: ¬ ( e : M, eval (update_evar_val (evar_fresh (elements (free_evars ϕ))) e ρ) ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ⊤)
x: M
H1: c : M, x ∈ eval (update_evar_val (fresh_evar ϕ) c ρ) ϕ^{evar:0↦fresh_evar ϕ}

x ∈ ∅
signature: Signature
M: Model
ϕ: Pattern
H: ρ : Valuation, eval ρ ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ⊤ ∨ eval ρ ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ∅
ρ: Valuation
H0: ¬ ( e : M, eval (update_evar_val (evar_fresh (elements (free_evars ϕ))) e ρ) ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ⊤)
x, c: M
H1: x ∈ eval (update_evar_val (fresh_evar ϕ) c ρ) ϕ^{evar:0↦fresh_evar ϕ}

x ∈ ∅
signature: Signature
M: Model
ϕ: Pattern
H: ρ : Valuation, eval ρ ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ⊤ ∨ eval ρ ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ∅
ρ: Valuation
H0: ( e : M, eval (update_evar_val (evar_fresh (elements (free_evars ϕ))) e ρ) ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ⊤) → False
x, c: M
H1: x ∈ eval (update_evar_val (fresh_evar ϕ) c ρ) ϕ^{evar:0↦fresh_evar ϕ}

x ∈ ∅
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation
c: M
H: eval (update_evar_val (evar_fresh (elements (free_evars ϕ))) c ρ) ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ⊤ ∨ eval (update_evar_val (evar_fresh (elements (free_evars ϕ))) c ρ) ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ∅
H0: ( e : M, eval (update_evar_val (evar_fresh (elements (free_evars ϕ))) e ρ) ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ⊤) → False
x: M
H1: x ∈ eval (update_evar_val (fresh_evar ϕ) c ρ) ϕ^{evar:0↦fresh_evar ϕ}

x ∈ ∅
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation
c: M
H: eval (update_evar_val (evar_fresh (elements (free_evars ϕ))) c ρ) ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ⊤
H0: ( e : M, eval (update_evar_val (evar_fresh (elements (free_evars ϕ))) e ρ) ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ⊤) → False
x: M
H1: x ∈ eval (update_evar_val (fresh_evar ϕ) c ρ) ϕ^{evar:0↦fresh_evar ϕ}

x ∈ ∅
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation
c: M
H: eval (update_evar_val (evar_fresh (elements (free_evars ϕ))) c ρ) ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ∅
H0: ( e : M, eval (update_evar_val (evar_fresh (elements (free_evars ϕ))) e ρ) ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ⊤) → False
x: M
H1: x ∈ eval (update_evar_val (fresh_evar ϕ) c ρ) ϕ^{evar:0↦fresh_evar ϕ}
x ∈ ∅
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation
c: M
H: eval (update_evar_val (evar_fresh (elements (free_evars ϕ))) c ρ) ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ⊤
H0: ( e : M, eval (update_evar_val (evar_fresh (elements (free_evars ϕ))) e ρ) ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ⊤) → False
x: M
H1: x ∈ eval (update_evar_val (fresh_evar ϕ) c ρ) ϕ^{evar:0↦fresh_evar ϕ}

x ∈ ∅
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation
c: M
H: eval (update_evar_val (evar_fresh (elements (free_evars ϕ))) c ρ) ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ⊤
H0: ( e : M, eval (update_evar_val (evar_fresh (elements (free_evars ϕ))) e ρ) ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ⊤) → False
x: M
H1: x ∈ eval (update_evar_val (fresh_evar ϕ) c ρ) ϕ^{evar:0↦fresh_evar ϕ}

False
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation
c: M
H: eval (update_evar_val (evar_fresh (elements (free_evars ϕ))) c ρ) ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ⊤
H0: ( e : M, eval (update_evar_val (evar_fresh (elements (free_evars ϕ))) e ρ) ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ⊤) → False
x: M
H1: x ∈ eval (update_evar_val (fresh_evar ϕ) c ρ) ϕ^{evar:0↦fresh_evar ϕ}

e : M, eval (update_evar_val (evar_fresh (elements (free_evars ϕ))) e ρ) ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ⊤
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation
c: M
H: eval (update_evar_val (evar_fresh (elements (free_evars ϕ))) c ρ) ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ⊤
H0: ( e : M, eval (update_evar_val (evar_fresh (elements (free_evars ϕ))) e ρ) ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ⊤) → False
x: M
H1: x ∈ eval (update_evar_val (fresh_evar ϕ) c ρ) ϕ^{evar:0↦fresh_evar ϕ}

eval (update_evar_val (evar_fresh (elements (free_evars ϕ))) c ρ) ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ⊤
apply H.
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation
c: M
H: eval (update_evar_val (evar_fresh (elements (free_evars ϕ))) c ρ) ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ∅
H0: ( e : M, eval (update_evar_val (evar_fresh (elements (free_evars ϕ))) e ρ) ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ⊤) → False
x: M
H1: x ∈ eval (update_evar_val (fresh_evar ϕ) c ρ) ϕ^{evar:0↦fresh_evar ϕ}

x ∈ ∅
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation
c: M
H: eval (update_evar_val (evar_fresh (elements (free_evars ϕ))) c ρ) ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} ⊆ ∅ ⊆ eval (update_evar_val (evar_fresh (elements (free_evars ϕ))) c ρ) ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))}
H0: ( e : M, eval (update_evar_val (evar_fresh (elements (free_evars ϕ))) e ρ) ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ⊤) → False
x: M
H1: x ∈ eval (update_evar_val (fresh_evar ϕ) c ρ) ϕ^{evar:0↦fresh_evar ϕ}

x ∈ ∅
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation
c: M
H: eval (update_evar_val (evar_fresh (elements (free_evars ϕ))) c ρ) ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} ⊆ ∅
H0: ( e : M, eval (update_evar_val (evar_fresh (elements (free_evars ϕ))) e ρ) ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ⊤) → False
x: M
H1: x ∈ eval (update_evar_val (fresh_evar ϕ) c ρ) ϕ^{evar:0↦fresh_evar ϕ}

x ∈ ∅
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation
c: M
H: x : M, x ∈ eval (update_evar_val (evar_fresh (elements (free_evars ϕ))) c ρ) ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} → x ∈ ∅
H0: ( e : M, eval (update_evar_val (evar_fresh (elements (free_evars ϕ))) e ρ) ϕ^{evar:0↦evar_fresh (elements (free_evars ϕ))} = ⊤) → False
x: M
H1: x ∈ eval (update_evar_val (fresh_evar ϕ) c ρ) ϕ^{evar:0↦fresh_evar ϕ}

x ∈ ∅
auto. Qed. Hint Resolve M_predicate_exists : core.
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation

M_predicate ϕ → eval ρ ϕ ≠ ∅ ↔ eval ρ ϕ = ⊤
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation

M_predicate ϕ → eval ρ ϕ ≠ ∅ ↔ eval ρ ϕ = ⊤
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation
Hmp: M_predicate ϕ

eval ρ ϕ ≠ ∅ ↔ eval ρ ϕ = ⊤
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation
Hmp: M_predicate ϕ

eval ρ ϕ ≠ ∅ → eval ρ ϕ = ⊤
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation
Hmp: M_predicate ϕ
eval ρ ϕ = ⊤ → eval ρ ϕ ≠ ∅
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation
Hmp: M_predicate ϕ

eval ρ ϕ ≠ ∅ → eval ρ ϕ = ⊤
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation
Hmp: M_predicate ϕ
Hne: eval ρ ϕ ≠ ∅

eval ρ ϕ = ⊤
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation
Hmp: eval ρ ϕ = ⊤ ∨ eval ρ ϕ = ∅
Hne: eval ρ ϕ ≠ ∅

eval ρ ϕ = ⊤
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation
H: eval ρ ϕ = ⊤
Hne: eval ρ ϕ ≠ ∅

eval ρ ϕ = ⊤
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation
H: eval ρ ϕ = ∅
Hne: eval ρ ϕ ≠ ∅
eval ρ ϕ = ⊤
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation
H: eval ρ ϕ = ⊤
Hne: eval ρ ϕ ≠ ∅

eval ρ ϕ = ⊤
assumption.
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation
H: eval ρ ϕ = ∅
Hne: eval ρ ϕ ≠ ∅

eval ρ ϕ = ⊤
contradiction.
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation
Hmp: M_predicate ϕ

eval ρ ϕ = ⊤ → eval ρ ϕ ≠ ∅
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation
Hmp: M_predicate ϕ
Hf: eval ρ ϕ = ⊤

eval ρ ϕ ≠ ∅
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation
Hmp: M_predicate ϕ
Hf: eval ρ ϕ = ⊤

eval ρ ϕ = Full
assumption. Qed.
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation

M_predicate ϕ → eval ρ ϕ ≠ ⊤ ↔ eval ρ ϕ = ∅
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation

M_predicate ϕ → eval ρ ϕ ≠ ⊤ ↔ eval ρ ϕ = ∅
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation
Hmp: M_predicate ϕ

eval ρ ϕ ≠ ⊤ ↔ eval ρ ϕ = ∅
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation
Hmp: M_predicate ϕ

eval ρ ϕ ≠ ⊤ → eval ρ ϕ = ∅
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation
Hmp: M_predicate ϕ
eval ρ ϕ = ∅ → eval ρ ϕ ≠ ⊤
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation
Hmp: M_predicate ϕ

eval ρ ϕ ≠ ⊤ → eval ρ ϕ = ∅
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation
Hmp: M_predicate ϕ
Hne: eval ρ ϕ ≠ ⊤

eval ρ ϕ = ∅
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation
Hmp: eval ρ ϕ = ⊤ ∨ eval ρ ϕ = ∅
Hne: eval ρ ϕ ≠ ⊤

eval ρ ϕ = ∅
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation
H: eval ρ ϕ = ⊤
Hne: eval ρ ϕ ≠ ⊤

eval ρ ϕ = ∅
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation
H: eval ρ ϕ = ∅
Hne: eval ρ ϕ ≠ ⊤
eval ρ ϕ = ∅
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation
H: eval ρ ϕ = ⊤
Hne: eval ρ ϕ ≠ ⊤

eval ρ ϕ = ∅
contradiction.
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation
H: eval ρ ϕ = ∅
Hne: eval ρ ϕ ≠ ⊤

eval ρ ϕ = ∅
assumption.
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation
Hmp: M_predicate ϕ

eval ρ ϕ = ∅ → eval ρ ϕ ≠ ⊤
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation
Hmp: M_predicate ϕ
Hf: eval ρ ϕ = ∅

eval ρ ϕ ≠ ⊤
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation
Hmp: M_predicate ϕ
Hf: eval ρ ϕ = ∅

eval ρ ϕ = Empty
assumption. Qed.
signature: Signature
M: Model
ϕ₁, ϕ₂: Pattern
ρ: Valuation

eval ρ (ϕ₁ ---> ϕ₂) = ⊤ → eval ρ ϕ₁ = ⊤ → eval ρ ϕ₂ = ⊤
signature: Signature
M: Model
ϕ₁, ϕ₂: Pattern
ρ: Valuation

eval ρ (ϕ₁ ---> ϕ₂) = ⊤ → eval ρ ϕ₁ = ⊤ → eval ρ ϕ₂ = ⊤
signature: Signature
M: Model
ϕ₁, ϕ₂: Pattern
ρ: Valuation

eval ρ (ϕ₁ ---> ϕ₂) = ⊤ → eval ρ ϕ₁ = ⊤ → eval ρ ϕ₂ = ⊤
signature: Signature
M: Model
ϕ₁, ϕ₂: Pattern
ρ: Valuation

⊤ ∖ eval ρ ϕ₁ ∪ eval ρ ϕ₂ = ⊤ → eval ρ ϕ₁ = ⊤ → eval ρ ϕ₂ = ⊤
signature: Signature
M: Model
ϕ₁, ϕ₂: Pattern
ρ: Valuation
H1: ⊤ ∖ eval ρ ϕ₁ ∪ eval ρ ϕ₂ = ⊤
H2: eval ρ ϕ₁ = ⊤

eval ρ ϕ₂ = ⊤
signature: Signature
M: Model
ϕ₁, ϕ₂: Pattern
ρ: Valuation
H1: ⊤ ∖ ⊤ ∪ eval ρ ϕ₂ = ⊤
H2: eval ρ ϕ₁ = ⊤

eval ρ ϕ₂ = ⊤
set_solver by auto. Qed.
signature: Signature
M: Model
ϕ₁, ϕ₂: Pattern
ρ: Valuation

M_predicate ϕ₁ → eval ρ (ϕ₁ ---> ϕ₂) = ⊤ ↔ (eval ρ ϕ₁ = ⊤ → eval ρ ϕ₂ = ⊤)
signature: Signature
M: Model
ϕ₁, ϕ₂: Pattern
ρ: Valuation

M_predicate ϕ₁ → eval ρ (ϕ₁ ---> ϕ₂) = ⊤ ↔ (eval ρ ϕ₁ = ⊤ → eval ρ ϕ₂ = ⊤)
signature: Signature
M: Model
ϕ₁, ϕ₂: Pattern
ρ: Valuation
Hpred: M_predicate ϕ₁

eval ρ (ϕ₁ ---> ϕ₂) = ⊤ ↔ (eval ρ ϕ₁ = ⊤ → eval ρ ϕ₂ = ⊤)
signature: Signature
M: Model
ϕ₁, ϕ₂: Pattern
ρ: Valuation
Hpred: M_predicate ϕ₁

eval ρ (ϕ₁ ---> ϕ₂) = ⊤ → eval ρ ϕ₁ = ⊤ → eval ρ ϕ₂ = ⊤
signature: Signature
M: Model
ϕ₁, ϕ₂: Pattern
ρ: Valuation
Hpred: M_predicate ϕ₁
(eval ρ ϕ₁ = ⊤ → eval ρ ϕ₂ = ⊤) → eval ρ (ϕ₁ ---> ϕ₂) = ⊤
signature: Signature
M: Model
ϕ₁, ϕ₂: Pattern
ρ: Valuation
Hpred: M_predicate ϕ₁

eval ρ (ϕ₁ ---> ϕ₂) = ⊤ → eval ρ ϕ₁ = ⊤ → eval ρ ϕ₂ = ⊤
signature: Signature
M: Model
ϕ₁, ϕ₂: Pattern
ρ: Valuation
Hpred: M_predicate ϕ₁
H: eval ρ (ϕ₁ ---> ϕ₂) = ⊤
H1: eval ρ ϕ₁ = ⊤

eval ρ ϕ₂ = ⊤
apply (eval_impl_MP _ _ _ H H1).
signature: Signature
M: Model
ϕ₁, ϕ₂: Pattern
ρ: Valuation
Hpred: M_predicate ϕ₁

(eval ρ ϕ₁ = ⊤ → eval ρ ϕ₂ = ⊤) → eval ρ (ϕ₁ ---> ϕ₂) = ⊤
signature: Signature
M: Model
ϕ₁, ϕ₂: Pattern
ρ: Valuation
Hpred: M_predicate ϕ₁
H: eval ρ ϕ₁ = ⊤ → eval ρ ϕ₂ = ⊤

eval ρ (ϕ₁ ---> ϕ₂) = ⊤
signature: Signature
M: Model
ϕ₁, ϕ₂: Pattern
ρ: Valuation
Hpred: M_predicate ϕ₁
H: eval ρ ϕ₁ = ⊤ → eval ρ ϕ₂ = ⊤

⊤ ∖ eval ρ ϕ₁ ∪ eval ρ ϕ₂ = ⊤
signature: Signature
M: Model
ϕ₁, ϕ₂: Pattern
ρ: Valuation
Hpred: M_predicate ϕ₁
H: eval ρ ϕ₁ = ⊤ → eval ρ ϕ₂ = ⊤
H0: eval ρ ϕ₁ = ⊤

⊤ ∖ eval ρ ϕ₁ ∪ eval ρ ϕ₂ = ⊤
signature: Signature
M: Model
ϕ₁, ϕ₂: Pattern
ρ: Valuation
Hpred: M_predicate ϕ₁
H: eval ρ ϕ₁ = ⊤ → eval ρ ϕ₂ = ⊤
H0: eval ρ ϕ₁ ≠ ⊤
⊤ ∖ eval ρ ϕ₁ ∪ eval ρ ϕ₂ = ⊤
signature: Signature
M: Model
ϕ₁, ϕ₂: Pattern
ρ: Valuation
Hpred: M_predicate ϕ₁
H: eval ρ ϕ₁ = ⊤ → eval ρ ϕ₂ = ⊤
H0: eval ρ ϕ₁ = ⊤

⊤ ∖ eval ρ ϕ₁ ∪ eval ρ ϕ₂ = ⊤
signature: Signature
M: Model
ϕ₁, ϕ₂: Pattern
ρ: Valuation
Hpred: M_predicate ϕ₁
H: eval ρ ϕ₂ = ⊤
H0: eval ρ ϕ₁ = ⊤

⊤ ∖ eval ρ ϕ₁ ∪ eval ρ ϕ₂ = ⊤
signature: Signature
M: Model
ϕ₁, ϕ₂: Pattern
ρ: Valuation
Hpred: M_predicate ϕ₁
H: eval ρ ϕ₂ = ⊤
H0: eval ρ ϕ₁ = ⊤

⊤ ∖ eval ρ ϕ₁ ∪ ⊤ = ⊤
signature: Signature
M: Model
ϕ₁, ϕ₂: Pattern
ρ: Valuation
Hpred: M_predicate ϕ₁
H: eval ρ ϕ₂ = ⊤
H0: eval ρ ϕ₁ = ⊤

⊤ ∖ ⊤ ∪ ⊤ = ⊤
set_solver by fail.
signature: Signature
M: Model
ϕ₁, ϕ₂: Pattern
ρ: Valuation
Hpred: M_predicate ϕ₁
H: eval ρ ϕ₁ = ⊤ → eval ρ ϕ₂ = ⊤
H0: eval ρ ϕ₁ ≠ ⊤

⊤ ∖ eval ρ ϕ₁ ∪ eval ρ ϕ₂ = ⊤
signature: Signature
M: Model
ϕ₁, ϕ₂: Pattern
ρ: Valuation
Hpred: M_predicate ϕ₁
H: eval ρ ϕ₁ = ⊤ → eval ρ ϕ₂ = ⊤
H0: eval ρ ϕ₁ = ∅

⊤ ∖ eval ρ ϕ₁ ∪ eval ρ ϕ₂ = ⊤
signature: Signature
M: Model
ϕ₁, ϕ₂: Pattern
ρ: Valuation
Hpred: M_predicate ϕ₁
H: eval ρ ϕ₁ = ⊤ → eval ρ ϕ₂ = ⊤
H0: eval ρ ϕ₁ ≠ ⊤
H1: (ϕ : Pattern) (ρ : Valuation), M_predicate ϕ → eval ρ ϕ ≠ ⊤ → eval ρ ϕ = ∅
M_predicate ϕ₁
signature: Signature
M: Model
ϕ₁, ϕ₂: Pattern
ρ: Valuation
Hpred: M_predicate ϕ₁
H: eval ρ ϕ₁ = ⊤ → eval ρ ϕ₂ = ⊤
H0: eval ρ ϕ₁ = ∅

⊤ ∖ eval ρ ϕ₁ ∪ eval ρ ϕ₂ = ⊤
signature: Signature
M: Model
ϕ₁, ϕ₂: Pattern
ρ: Valuation
Hpred: M_predicate ϕ₁
H: eval ρ ϕ₁ = ⊤ → eval ρ ϕ₂ = ⊤
H0: eval ρ ϕ₁ = ∅

⊤ ∖ ∅ ∪ eval ρ ϕ₂ = ⊤
set_solver by fail. Qed. (* ϕ is a well-formed body of ex *)
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation

let x := fresh_evar ϕ in M_predicate ϕ^{evar:0↦x} → eval ρ (ex , ϕ) = ⊤ ↔ ( m : M, eval (update_evar_val x m ρ) ϕ^{evar:0↦x} = ⊤)
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation

let x := fresh_evar ϕ in M_predicate ϕ^{evar:0↦x} → eval ρ (ex , ϕ) = ⊤ ↔ ( m : M, eval (update_evar_val x m ρ) ϕ^{evar:0↦x} = ⊤)
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation
x:= fresh_evar ϕ: evar
Hpred: M_predicate ϕ^{evar:0↦x}

eval ρ (ex , ϕ) = ⊤ ↔ ( m : M, eval (update_evar_val x m ρ) ϕ^{evar:0↦x} = ⊤)
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation
x:= fresh_evar ϕ: evar
Hpred: M_predicate ϕ^{evar:0↦x}
Hpredex: M_predicate (ex , ϕ)

eval ρ (ex , ϕ) = ⊤ ↔ ( m : M, eval (update_evar_val x m ρ) ϕ^{evar:0↦x} = ⊤)
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation
x:= fresh_evar ϕ: evar
Hpred: M_predicate ϕ^{evar:0↦x}
Hpredex: M_predicate (ex , ϕ)

M_predicate (ex , ϕ)
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation
x:= fresh_evar ϕ: evar
Hpred: M_predicate ϕ^{evar:0↦x}
Hpredex: M_predicate (ex , ϕ)
eval ρ (ex , ϕ) ≠ ∅ ↔ ( m : M, eval (update_evar_val x m ρ) ϕ^{evar:0↦x} = ⊤)
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation
x:= fresh_evar ϕ: evar
Hpred: M_predicate ϕ^{evar:0↦x}
Hpredex: M_predicate (ex , ϕ)

M_predicate (ex , ϕ)
apply Hpredex.
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation
x:= fresh_evar ϕ: evar
Hpred: M_predicate ϕ^{evar:0↦x}
Hpredex: M_predicate (ex , ϕ)

eval ρ (ex , ϕ) ≠ ∅ ↔ ( m : M, eval (update_evar_val x m ρ) ϕ^{evar:0↦x} = ⊤)
(* (* TODO: I would like to simplify the RHS, but cannot find a way. *) under [fun m => _]functional_extensionality => m. (* This fails *) Fail rewrite <- predicate_not_empty_iff_full. Fail rewrite -[_ = Full]predicate_not_empty_iff_full. over. *)
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation
x:= fresh_evar ϕ: evar
Hpred: M_predicate ϕ^{evar:0↦x}
Hpredex: M_predicate (ex , ϕ)

( x : M, x ∈ eval ρ (ex , ϕ)) ↔ ( m : M, eval (update_evar_val x m ρ) ϕ^{evar:0↦x} = ⊤)
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation
x:= fresh_evar ϕ: evar
Hpred: M_predicate ϕ^{evar:0↦x}
Hpredex: M_predicate (ex , ϕ)

( x : M, x ∈ eval ρ (ex , ϕ)) → m : M, eval (update_evar_val x m ρ) ϕ^{evar:0↦x} = ⊤
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation
x:= fresh_evar ϕ: evar
Hpred: M_predicate ϕ^{evar:0↦x}
Hpredex: M_predicate (ex , ϕ)
( m : M, eval (update_evar_val x m ρ) ϕ^{evar:0↦x} = ⊤) → x : M, x ∈ eval ρ (ex , ϕ)
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation
x:= fresh_evar ϕ: evar
Hpred: M_predicate ϕ^{evar:0↦x}
Hpredex: M_predicate (ex , ϕ)

( x : M, x ∈ eval ρ (ex , ϕ)) → m : M, eval (update_evar_val x m ρ) ϕ^{evar:0↦x} = ⊤
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation
x:= fresh_evar ϕ: evar
Hpred: M_predicate ϕ^{evar:0↦x}
Hpredex: M_predicate (ex , ϕ)
x0: M
Hx0: x0 ∈ eval ρ (ex , ϕ)

m : M, eval (update_evar_val x m ρ) ϕ^{evar:0↦x} = ⊤
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation
x:= fresh_evar ϕ: evar
Hpred: M_predicate ϕ^{evar:0↦x}
Hpredex: M_predicate (ex , ϕ)
x0: M
Hx0: x0 ∈ (let x := fresh_evar ϕ in propset_fa_union (λ e : M, let ρ' := update_evar_val x e ρ in eval ρ' ϕ^{evar:0↦x}))

m : M, eval (update_evar_val x m ρ) ϕ^{evar:0↦x} = ⊤
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation
x:= fresh_evar ϕ: evar
Hpred: M_predicate ϕ^{evar:0↦x}
Hpredex: M_predicate (ex , ϕ)
x0: M
Hx0: x0 ∈ propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ) e ρ) ϕ^{evar:0↦fresh_evar ϕ})

m : M, eval (update_evar_val x m ρ) ϕ^{evar:0↦x} = ⊤
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation
x:= fresh_evar ϕ: evar
Hpred: M_predicate ϕ^{evar:0↦x}
Hpredex: M_predicate (ex , ϕ)
x0: M
Hx0: x0 ∈ {[ x | c : M, x ∈ eval (update_evar_val (fresh_evar ϕ) c ρ) ϕ^{evar:0↦ fresh_evar ϕ} ]}

m : M, eval (update_evar_val x m ρ) ϕ^{evar:0↦x} = ⊤
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation
x:= fresh_evar ϕ: evar
Hpred: M_predicate ϕ^{evar:0↦x}
Hpredex: M_predicate (ex , ϕ)
x0: M
Hx0: c : M, x0 ∈ eval (update_evar_val (fresh_evar ϕ) c ρ) ϕ^{evar:0↦fresh_evar ϕ}

m : M, eval (update_evar_val x m ρ) ϕ^{evar:0↦x} = ⊤
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation
x:= fresh_evar ϕ: evar
Hpred: M_predicate ϕ^{evar:0↦x}
Hpredex: M_predicate (ex , ϕ)
x0, c: M
Hc: x0 ∈ eval (update_evar_val (fresh_evar ϕ) c ρ) ϕ^{evar:0↦fresh_evar ϕ}

m : M, eval (update_evar_val x m ρ) ϕ^{evar:0↦x} = ⊤
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation
x:= fresh_evar ϕ: evar
Hpred: M_predicate ϕ^{evar:0↦x}
Hpredex: M_predicate (ex , ϕ)
x0, c: M
Hc: x0 ∈ eval (update_evar_val (fresh_evar ϕ) c ρ) ϕ^{evar:0↦fresh_evar ϕ}

eval (update_evar_val x c ρ) ϕ^{evar:0↦x} = ⊤
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation
x:= fresh_evar ϕ: evar
Hpred: M_predicate ϕ^{evar:0↦x}
Hpredex: M_predicate (ex , ϕ)
x0, c: M
Hc: x0 ∈ eval (update_evar_val (fresh_evar ϕ) c ρ) ϕ^{evar:0↦fresh_evar ϕ}

M_predicate ϕ^{evar:0↦x}
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation
x:= fresh_evar ϕ: evar
Hpred: M_predicate ϕ^{evar:0↦x}
Hpredex: M_predicate (ex , ϕ)
x0, c: M
Hc: x0 ∈ eval (update_evar_val (fresh_evar ϕ) c ρ) ϕ^{evar:0↦fresh_evar ϕ}
eval (update_evar_val x c ρ) ϕ^{evar:0↦x} ≠ ∅
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation
x:= fresh_evar ϕ: evar
Hpred: M_predicate ϕ^{evar:0↦x}
Hpredex: M_predicate (ex , ϕ)
x0, c: M
Hc: x0 ∈ eval (update_evar_val (fresh_evar ϕ) c ρ) ϕ^{evar:0↦fresh_evar ϕ}

M_predicate ϕ^{evar:0↦x}
apply Hpred.
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation
x:= fresh_evar ϕ: evar
Hpred: M_predicate ϕ^{evar:0↦x}
Hpredex: M_predicate (ex , ϕ)
x0, c: M
Hc: x0 ∈ eval (update_evar_val (fresh_evar ϕ) c ρ) ϕ^{evar:0↦fresh_evar ϕ}

eval (update_evar_val x c ρ) ϕ^{evar:0↦x} ≠ ∅
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation
x:= fresh_evar ϕ: evar
Hpred: M_predicate ϕ^{evar:0↦x}
Hpredex: M_predicate (ex , ϕ)
x0, c: M
Hc: x0 ∈ eval (update_evar_val (fresh_evar ϕ) c ρ) ϕ^{evar:0↦fresh_evar ϕ}

x0 : M, x0 ∈ eval (update_evar_val x c ρ) ϕ^{evar:0↦x}
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation
x:= fresh_evar ϕ: evar
Hpred: M_predicate ϕ^{evar:0↦x}
Hpredex: M_predicate (ex , ϕ)
x0, c: M
Hc: x0 ∈ eval (update_evar_val (fresh_evar ϕ) c ρ) ϕ^{evar:0↦fresh_evar ϕ}

x0 ∈ eval (update_evar_val x c ρ) ϕ^{evar:0↦x}
apply Hc.
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation
x:= fresh_evar ϕ: evar
Hpred: M_predicate ϕ^{evar:0↦x}
Hpredex: M_predicate (ex , ϕ)

( m : M, eval (update_evar_val x m ρ) ϕ^{evar:0↦x} = ⊤) → x : M, x ∈ eval ρ (ex , ϕ)
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation
x:= fresh_evar ϕ: evar
Hpred: M_predicate ϕ^{evar:0↦x}
Hpredex: M_predicate (ex , ϕ)
m: M
Hm: eval (update_evar_val x m ρ) ϕ^{evar:0↦x} = ⊤

x : M, x ∈ eval ρ (ex , ϕ)
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation
x:= fresh_evar ϕ: evar
Hpred: M_predicate ϕ^{evar:0↦x}
Hpredex: M_predicate (ex , ϕ)
m: M
Hm: eval (update_evar_val x m ρ) ϕ^{evar:0↦x} ≠ Empty

x : M, x ∈ eval ρ (ex , ϕ)
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation
x:= fresh_evar ϕ: evar
Hpred: M_predicate ϕ^{evar:0↦x}
Hpredex: M_predicate (ex , ϕ)
m: M
Hm: x0 : M, x0 ∈ eval (update_evar_val x m ρ) ϕ^{evar:0↦x}

x : M, x ∈ eval ρ (ex , ϕ)
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation
x:= fresh_evar ϕ: evar
Hpred: M_predicate ϕ^{evar:0↦x}
Hpredex: M_predicate (ex , ϕ)
m, x0: M
Hx0: x0 ∈ eval (update_evar_val x m ρ) ϕ^{evar:0↦x}

x : M, x ∈ eval ρ (ex , ϕ)
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation
x:= fresh_evar ϕ: evar
Hpred: M_predicate ϕ^{evar:0↦x}
Hpredex: M_predicate (ex , ϕ)
m, x0: M
Hx0: x0 ∈ eval (update_evar_val x m ρ) ϕ^{evar:0↦x}

x0 ∈ eval ρ (ex , ϕ)
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation
x:= fresh_evar ϕ: evar
Hpred: M_predicate ϕ^{evar:0↦x}
Hpredex: M_predicate (ex , ϕ)
m, x0: M
Hx0: x0 ∈ eval (update_evar_val x m ρ) ϕ^{evar:0↦x}

x0 ∈ (let x := fresh_evar ϕ in propset_fa_union (λ e : M, let ρ' := update_evar_val x e ρ in eval ρ' ϕ^{evar:0↦x}))
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation
x:= fresh_evar ϕ: evar
Hpred: M_predicate ϕ^{evar:0↦x}
Hpredex: M_predicate (ex , ϕ)
m, x0: M
Hx0: x0 ∈ eval (update_evar_val x m ρ) ϕ^{evar:0↦x}

x0 ∈ propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ) e ρ) ϕ^{evar:0↦fresh_evar ϕ})
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation
x:= fresh_evar ϕ: evar
Hpred: M_predicate ϕ^{evar:0↦x}
Hpredex: M_predicate (ex , ϕ)
m, x0: M
Hx0: x0 ∈ eval (update_evar_val x m ρ) ϕ^{evar:0↦x}

x0 ∈ {[ x | c : M, x ∈ eval (update_evar_val (fresh_evar ϕ) c ρ) ϕ^{evar:0↦fresh_evar ϕ} ]}
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation
x:= fresh_evar ϕ: evar
Hpred: M_predicate ϕ^{evar:0↦x}
Hpredex: M_predicate (ex , ϕ)
m, x0: M
Hx0: x0 ∈ eval (update_evar_val x m ρ) ϕ^{evar:0↦x}

c : M, x0 ∈ eval (update_evar_val (fresh_evar ϕ) c ρ) ϕ^{evar:0↦fresh_evar ϕ}
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation
x:= fresh_evar ϕ: evar
Hpred: M_predicate ϕ^{evar:0↦x}
Hpredex: M_predicate (ex , ϕ)
m, x0: M
Hx0: x0 ∈ eval (update_evar_val x m ρ) ϕ^{evar:0↦x}

x0 ∈ eval (update_evar_val (fresh_evar ϕ) m ρ) ϕ^{evar:0↦fresh_evar ϕ}
assumption. Qed.
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation

let x := fresh_evar ϕ in eval ρ (ex , ϕ) = ∅ ↔ ( m : M, eval (update_evar_val x m ρ) ϕ^{evar:0↦x} = ∅)
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation

let x := fresh_evar ϕ in eval ρ (ex , ϕ) = ∅ ↔ ( m : M, eval (update_evar_val x m ρ) ϕ^{evar:0↦x} = ∅)
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation
x:= fresh_evar ϕ: evar

eval ρ (ex , ϕ) = ∅ ↔ ( m : M, eval (update_evar_val x m ρ) ϕ^{evar:0↦x} = ∅)
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation
x:= fresh_evar ϕ: evar

(let x := fresh_evar ϕ in propset_fa_union (λ e : M, let ρ' := update_evar_val x e ρ in eval ρ' ϕ^{evar:0↦x})) = ∅ ↔ ( m : M, eval (update_evar_val x m ρ) ϕ^{evar:0↦x} = ∅)
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation
x:= fresh_evar ϕ: evar

propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ) e ρ) ϕ^{evar:0↦fresh_evar ϕ}) = ∅ ↔ ( m : M, eval (update_evar_val x m ρ) ϕ^{evar:0↦x} = ∅)
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation
x:= fresh_evar ϕ: evar

propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ) e ρ) ϕ^{evar:0↦fresh_evar ϕ}) ⊆ ∅ ⊆ propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ) e ρ) ϕ^{evar:0↦fresh_evar ϕ}) ↔ ( m : M, eval (update_evar_val x m ρ) ϕ^{evar:0↦x} = ∅)
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation
x:= fresh_evar ϕ: evar

propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ) e ρ) ϕ^{evar:0↦fresh_evar ϕ}) ⊆ ∅ ⊆ propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ) e ρ) ϕ^{evar:0↦fresh_evar ϕ}) → m : M, eval (update_evar_val x m ρ) ϕ^{evar:0↦x} = ∅
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation
x:= fresh_evar ϕ: evar
( m : M, eval (update_evar_val x m ρ) ϕ^{evar:0↦x} = ∅) → propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ) e ρ) ϕ^{evar:0↦fresh_evar ϕ}) ⊆ ∅ ⊆ propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ) e ρ) ϕ^{evar:0↦fresh_evar ϕ})
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation
x:= fresh_evar ϕ: evar

propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ) e ρ) ϕ^{evar:0↦fresh_evar ϕ}) ⊆ ∅ ⊆ propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ) e ρ) ϕ^{evar:0↦fresh_evar ϕ}) → m : M, eval (update_evar_val x m ρ) ϕ^{evar:0↦x} = ∅
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation
x:= fresh_evar ϕ: evar
H1: propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ) e ρ) ϕ^{evar:0↦fresh_evar ϕ}) ⊆ ∅
m: M

eval (update_evar_val x m ρ) ϕ^{evar:0↦x} = ∅
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation
x:= fresh_evar ϕ: evar
H1: x : M, x ∈ propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ) e ρ) ϕ^{evar:0↦fresh_evar ϕ}) → x ∈ ∅
m: M

eval (update_evar_val x m ρ) ϕ^{evar:0↦x} = ∅
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation
x:= fresh_evar ϕ: evar
H1: x : M, x ∈ {[ x0 | c : M, x0 ∈ eval (update_evar_val (fresh_evar ϕ) c ρ) ϕ^{evar:0↦ fresh_evar ϕ} ]} → x ∈ ∅
m: M

eval (update_evar_val x m ρ) ϕ^{evar:0↦x} = ∅
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation
x:= fresh_evar ϕ: evar
H1: x : M, ( c : M, x ∈ eval (update_evar_val (fresh_evar ϕ) c ρ) ϕ^{evar:0↦fresh_evar ϕ}) → x ∈ ∅
m: M

eval (update_evar_val x m ρ) ϕ^{evar:0↦x} = ∅
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation
x:= fresh_evar ϕ: evar
H1: x : M, ( c : M, x ∈ eval (update_evar_val (fresh_evar ϕ) c ρ) ϕ^{evar:0↦fresh_evar ϕ}) → x ∈ ∅
m: M

eval (update_evar_val x m ρ) ϕ^{evar:0↦x} ⊆ ∅ ⊆ eval (update_evar_val x m ρ) ϕ^{evar:0↦x}
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation
x:= fresh_evar ϕ: evar
H1: x : M, ( c : M, x ∈ eval (update_evar_val (fresh_evar ϕ) c ρ) ϕ^{evar:0↦fresh_evar ϕ}) → x ∈ ∅
m: M

eval (update_evar_val x m ρ) ϕ^{evar:0↦x} ⊆ ∅
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation
x:= fresh_evar ϕ: evar
H1: x : M, ( c : M, x ∈ eval (update_evar_val (fresh_evar ϕ) c ρ) ϕ^{evar:0↦fresh_evar ϕ}) → x ∈ ∅
m: M
∅ ⊆ eval (update_evar_val x m ρ) ϕ^{evar:0↦x}
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation
x:= fresh_evar ϕ: evar
H1: x : M, ( c : M, x ∈ eval (update_evar_val (fresh_evar ϕ) c ρ) ϕ^{evar:0↦fresh_evar ϕ}) → x ∈ ∅
m: M

∅ ⊆ eval (update_evar_val x m ρ) ϕ^{evar:0↦x}
apply empty_subseteq.
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation
x:= fresh_evar ϕ: evar
H1: x : M, ( c : M, x ∈ eval (update_evar_val (fresh_evar ϕ) c ρ) ϕ^{evar:0↦fresh_evar ϕ}) → x ∈ ∅
m: M

eval (update_evar_val x m ρ) ϕ^{evar:0↦x} ⊆ ∅
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation
x:= fresh_evar ϕ: evar
H1: x : M, ( c : M, x ∈ eval (update_evar_val (fresh_evar ϕ) c ρ) ϕ^{evar:0↦fresh_evar ϕ}) → x ∈ ∅
m: M

x0 : M, x0 ∈ eval (update_evar_val x m ρ) ϕ^{evar:0↦x} → x0 ∈ ∅
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation
x:= fresh_evar ϕ: evar
H1: x : M, ( c : M, x ∈ eval (update_evar_val (fresh_evar ϕ) c ρ) ϕ^{evar:0↦fresh_evar ϕ}) → x ∈ ∅
m, x0: M

x0 ∈ eval (update_evar_val x m ρ) ϕ^{evar:0↦x} → x0 ∈ ∅
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation
x:= fresh_evar ϕ: evar
H1: x : M, ( c : M, x ∈ eval (update_evar_val (fresh_evar ϕ) c ρ) ϕ^{evar:0↦fresh_evar ϕ}) → x ∈ ∅
m, x0: M
Contra: x0 ∈ eval (update_evar_val x m ρ) ϕ^{evar:0↦x}

x0 ∈ ∅
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation
x:= fresh_evar ϕ: evar
x0: M
H1: ( c : M, x0 ∈ eval (update_evar_val (fresh_evar ϕ) c ρ) ϕ^{evar:0↦fresh_evar ϕ}) → x0 ∈ ∅
m: M
Contra: x0 ∈ eval (update_evar_val x m ρ) ϕ^{evar:0↦x}

x0 ∈ ∅
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation
x:= fresh_evar ϕ: evar
x0: M
H1: ( c : M, x0 ∈ eval (update_evar_val (fresh_evar ϕ) c ρ) ϕ^{evar:0↦fresh_evar ϕ}) → x0 ∈ ∅
m: M
Contra: x0 ∈ eval (update_evar_val x m ρ) ϕ^{evar:0↦x}

c : M, x0 ∈ eval (update_evar_val (fresh_evar ϕ) c ρ) ϕ^{evar:0↦fresh_evar ϕ}
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation
x:= fresh_evar ϕ: evar
x0: M
H1: ( c : M, x0 ∈ eval (update_evar_val (fresh_evar ϕ) c ρ) ϕ^{evar:0↦fresh_evar ϕ}) → x0 ∈ ∅
m: M
Contra: x0 ∈ eval (update_evar_val x m ρ) ϕ^{evar:0↦x}

x0 ∈ eval (update_evar_val (fresh_evar ϕ) m ρ) ϕ^{evar:0↦fresh_evar ϕ}
assumption.
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation
x:= fresh_evar ϕ: evar

( m : M, eval (update_evar_val x m ρ) ϕ^{evar:0↦x} = ∅) → propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ) e ρ) ϕ^{evar:0↦fresh_evar ϕ}) ⊆ ∅ ⊆ propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ) e ρ) ϕ^{evar:0↦fresh_evar ϕ})
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation
x:= fresh_evar ϕ: evar
H: m : M, eval (update_evar_val x m ρ) ϕ^{evar:0↦x} = ∅

propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ) e ρ) ϕ^{evar:0↦fresh_evar ϕ}) ⊆ ∅ ⊆ propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ) e ρ) ϕ^{evar:0↦fresh_evar ϕ})
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation
x:= fresh_evar ϕ: evar
H: m : M, eval (update_evar_val x m ρ) ϕ^{evar:0↦x} = ∅

propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ) e ρ) ϕ^{evar:0↦fresh_evar ϕ}) ⊆ ∅
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation
x:= fresh_evar ϕ: evar
H: m : M, eval (update_evar_val x m ρ) ϕ^{evar:0↦x} = ∅
∅ ⊆ propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ) e ρ) ϕ^{evar:0↦fresh_evar ϕ})
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation
x:= fresh_evar ϕ: evar
H: m : M, eval (update_evar_val x m ρ) ϕ^{evar:0↦x} = ∅

∅ ⊆ propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ) e ρ) ϕ^{evar:0↦fresh_evar ϕ})
apply empty_subseteq.
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation
x:= fresh_evar ϕ: evar
H: m : M, eval (update_evar_val x m ρ) ϕ^{evar:0↦x} = ∅

propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ) e ρ) ϕ^{evar:0↦fresh_evar ϕ}) ⊆ ∅
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation
x:= fresh_evar ϕ: evar
H: m : M, eval (update_evar_val x m ρ) ϕ^{evar:0↦x} = ∅

x : M, x ∈ propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ) e ρ) ϕ^{evar:0↦fresh_evar ϕ}) → x ∈ ∅
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation
x:= fresh_evar ϕ: evar
H: m : M, eval (update_evar_val x m ρ) ϕ^{evar:0↦x} = ∅
x0: M

x0 ∈ propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ) e ρ) ϕ^{evar:0↦fresh_evar ϕ}) → x0 ∈ ∅
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation
x:= fresh_evar ϕ: evar
H: m : M, eval (update_evar_val x m ρ) ϕ^{evar:0↦x} = ∅
x0: M
Contra: x0 ∈ propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ) e ρ) ϕ^{evar:0↦fresh_evar ϕ})

x0 ∈ ∅
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation
x:= fresh_evar ϕ: evar
H: m : M, eval (update_evar_val x m ρ) ϕ^{evar:0↦x} = ∅
x0: M
Contra: x0 ∈ {[ x | c : M, x ∈ eval (update_evar_val (fresh_evar ϕ) c ρ) ϕ^{evar:0↦ fresh_evar ϕ} ]}

x0 ∈ ∅
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation
x:= fresh_evar ϕ: evar
H: m : M, eval (update_evar_val x m ρ) ϕ^{evar:0↦x} = ∅
x0: M
Contra: c : M, x0 ∈ eval (update_evar_val (fresh_evar ϕ) c ρ) ϕ^{evar:0↦fresh_evar ϕ}

x0 ∈ ∅
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation
x:= fresh_evar ϕ: evar
H: m : M, eval (update_evar_val x m ρ) ϕ^{evar:0↦x} = ∅
x0, m: M
Contra: x0 ∈ eval (update_evar_val (fresh_evar ϕ) m ρ) ϕ^{evar:0↦fresh_evar ϕ}

x0 ∈ ∅
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation
x:= fresh_evar ϕ: evar
H: m : M, eval (update_evar_val x m ρ) ϕ^{evar:0↦x} = ∅
x0, m: M
Contra: x0 ∈ ∅

x0 ∈ ∅
exact Contra. Qed. (* Theory,axiom ref. snapshot: Definition 5 *) End with_explicit_model. Definition satisfies_model (M : Model) (ϕ : Pattern) : Prop := forall (ρ : Valuation), eval (M := M) ρ ϕ = ⊤. Definition satisfies_theory (m : Model) (theory : Theory) : Prop := forall axiom : Pattern, axiom ∈ theory -> (satisfies_model m axiom). (* TODO rename *) Definition satisfies (theory : Theory) (p: Pattern) : Prop := forall m : Model, (satisfies_theory m theory) -> (satisfies_model m p).
signature, Σ: Signature
NAs: NamedAxioms
M: Model

satisfies_theory M (theory_of_NamedAxioms NAs) ↔ ( n : NAName NAs, satisfies_model M (NAAxiom NAs n))
signature, Σ: Signature
NAs: NamedAxioms
M: Model

satisfies_theory M (theory_of_NamedAxioms NAs) ↔ ( n : NAName NAs, satisfies_model M (NAAxiom NAs n))
signature, Σ: Signature
NAs: NamedAxioms
M: Model

satisfies_theory M (theory_of_NamedAxioms NAs) → n : NAName NAs, satisfies_model M (NAAxiom NAs n)
signature, Σ: Signature
NAs: NamedAxioms
M: Model
( n : NAName NAs, satisfies_model M (NAAxiom NAs n)) → satisfies_theory M (theory_of_NamedAxioms NAs)
signature, Σ: Signature
NAs: NamedAxioms
M: Model

satisfies_theory M (theory_of_NamedAxioms NAs) → n : NAName NAs, satisfies_model M (NAAxiom NAs n)
signature, Σ: Signature
NAs: NamedAxioms
M: Model
H: satisfies_theory M (theory_of_NamedAxioms NAs)
n: NAName NAs

satisfies_model M (NAAxiom NAs n)
signature, Σ: Signature
NAs: NamedAxioms
M: Model
H: axiom : Pattern, axiom ∈ theory_of_NamedAxioms NAs → satisfies_model M axiom
n: NAName NAs

satisfies_model M (NAAxiom NAs n)
signature, Σ: Signature
NAs: NamedAxioms
M: Model
n: NAName NAs
H: NAAxiom NAs n ∈ theory_of_NamedAxioms NAs → satisfies_model M (NAAxiom NAs n)

satisfies_model M (NAAxiom NAs n)
signature, Σ: Signature
NAs: NamedAxioms
M: Model
n: NAName NAs
H: NAAxiom NAs n ∈ theory_of_NamedAxioms NAs → satisfies_model M (NAAxiom NAs n)

NAAxiom NAs n ∈ theory_of_NamedAxioms NAs
signature, Σ: Signature
NAs: NamedAxioms
M: Model
n: NAName NAs
H: NAAxiom NAs n ∈ theory_of_NamedAxioms NAs → satisfies_model M (NAAxiom NAs n)

NAAxiom NAs n ∈ theory_of_NamedAxioms NAs
signature, Σ: Signature
NAs: NamedAxioms
M: Model
n: NAName NAs
H: NAAxiom NAs n ∈ theory_of_NamedAxioms NAs → satisfies_model M (NAAxiom NAs n)

NAAxiom NAs n ∈ {[ p | n : NAName NAs, p = NAAxiom NAs n ]}
signature, Σ: Signature
NAs: NamedAxioms
M: Model
n: NAName NAs
H: NAAxiom NAs n ∈ theory_of_NamedAxioms NAs → satisfies_model M (NAAxiom NAs n)

NAAxiom NAs n = NAAxiom NAs n
auto.
signature, Σ: Signature
NAs: NamedAxioms
M: Model

( n : NAName NAs, satisfies_model M (NAAxiom NAs n)) → satisfies_theory M (theory_of_NamedAxioms NAs)
signature, Σ: Signature
NAs: NamedAxioms
M: Model
H: n : NAName NAs, satisfies_model M (NAAxiom NAs n)

satisfies_theory M (theory_of_NamedAxioms NAs)
signature, Σ: Signature
NAs: NamedAxioms
M: Model
H: n : NAName NAs, satisfies_model M (NAAxiom NAs n)
ax: Pattern
Hax: ax ∈ theory_of_NamedAxioms NAs

satisfies_model M ax
signature, Σ: Signature
NAs: NamedAxioms
M: Model
H: n : NAName NAs, satisfies_model M (NAAxiom NAs n)
ax: Pattern
Hax: ax ∈ theory_of_NamedAxioms NAs

satisfies_model M ax
signature, Σ: Signature
NAs: NamedAxioms
M: Model
H: n : NAName NAs, satisfies_model M (NAAxiom NAs n)
ax: Pattern
Hax: ax ∈ {[ p | n : NAName NAs, p = NAAxiom NAs n ]}

satisfies_model M ax
signature, Σ: Signature
NAs: NamedAxioms
M: Model
H: n : NAName NAs, satisfies_model M (NAAxiom NAs n)
ax: Pattern
axname: NAName NAs
Haxname: ax = NAAxiom NAs axname

satisfies_model M ax
signature, Σ: Signature
NAs: NamedAxioms
M: Model
H: n : NAName NAs, satisfies_model M (NAAxiom NAs n)
axname: NAName NAs

satisfies_model M (NAAxiom NAs axname)
apply H. Qed.
signature: Signature
M: Model
Γ₁, Γ₂: Theory

Γ₁ ⊆ Γ₂ → satisfies_theory M Γ₂ → satisfies_theory M Γ₁
signature: Signature
M: Model
Γ₁, Γ₂: Theory

Γ₁ ⊆ Γ₂ → satisfies_theory M Γ₂ → satisfies_theory M Γ₁
signature: Signature
M: Model
Γ₁, Γ₂: Theory

Γ₁ ⊆ Γ₂ → ( axiom : Pattern, axiom ∈ Γ₂ → satisfies_model M axiom) → axiom : Pattern, axiom ∈ Γ₁ → satisfies_model M axiom
set_solver by fail. Qed. (* theory predicate *) Definition T_predicate Γ ϕ := forall M, satisfies_theory M Γ -> M_predicate M ϕ. Hint Extern 4 (M_predicate _ (evar_open _ _ _)) => mlSimpl : core. Hint Extern 4 (T_predicate _ (evar_open _ _ _)) => mlSimpl : core. Hint Extern 4 (M_predicate _ (svar_open _ _ _)) => mlSimpl : core. Hint Extern 4 (T_predicate _ (svar_open _ _ _)) => mlSimpl : core.
signature: Signature
M: Model
Γ: Theory
ϕ: Pattern

satisfies_theory M Γ → T_predicate Γ ϕ → M_predicate M ϕ
signature: Signature
M: Model
Γ: Theory
ϕ: Pattern

satisfies_theory M Γ → T_predicate Γ ϕ → M_predicate M ϕ
signature: Signature
M: Model
Γ: Theory
ϕ: Pattern

satisfies_theory M Γ → ( M : Model, satisfies_theory M Γ → M_predicate M ϕ) → M_predicate M ϕ
auto. Qed. Hint Resolve T_predicate_impl_M_predicate : core.
signature: Signature
Γ: Theory
ϕ₁, ϕ₂: Pattern

T_predicate Γ ϕ₁ → T_predicate Γ ϕ₂ → T_predicate Γ (ϕ₁ ---> ϕ₂)
signature: Signature
Γ: Theory
ϕ₁, ϕ₂: Pattern

T_predicate Γ ϕ₁ → T_predicate Γ ϕ₂ → T_predicate Γ (ϕ₁ ---> ϕ₂)
signature: Signature
Γ: Theory
ϕ₁, ϕ₂: Pattern

( M : Model, satisfies_theory M Γ → M_predicate M ϕ₁) → ( M : Model, satisfies_theory M Γ → M_predicate M ϕ₂) → M : Model, satisfies_theory M Γ → M_predicate M (ϕ₁ ---> ϕ₂)
signature: Signature
Γ: Theory
ϕ₁, ϕ₂: Pattern
H: M : Model, satisfies_theory M Γ → M_predicate M ϕ₁
H0: M : Model, satisfies_theory M Γ → M_predicate M ϕ₂
M: Model
H1: satisfies_theory M Γ

M_predicate M (ϕ₁ ---> ϕ₂)
auto using M_predicate_impl. Qed. Hint Resolve T_predicate_impl : core.
signature: Signature
Γ: Theory

T_predicate Γ ⊥
signature: Signature
Γ: Theory

T_predicate Γ ⊥
signature: Signature
Γ: Theory

M : Model, satisfies_theory M Γ → M_predicate M ⊥
signature: Signature
Γ: Theory
M: Model
H: satisfies_theory M Γ

M_predicate M ⊥
auto using M_predicate_bott. Qed. Hint Resolve T_predicate_bot : core. (* TODO: top iff exists forall *) Section with_model. Context {M : Model}. (* If phi1 \subseteq phi2, then U_x phi1 \subseteq U_x phi2 *)
signature: Signature
M: Model
x: evar
ϕ₁, ϕ₂: Pattern

( ρ : Valuation, eval ρ ϕ₁ ⊆ eval ρ ϕ₂) → ρ : Valuation, propset_fa_union (λ e : M, eval (update_evar_val x e ρ) ϕ₁) ⊆ propset_fa_union (λ e : M, eval (update_evar_val x e ρ) ϕ₂)
signature: Signature
M: Model
x: evar
ϕ₁, ϕ₂: Pattern

( ρ : Valuation, eval ρ ϕ₁ ⊆ eval ρ ϕ₂) → ρ : Valuation, propset_fa_union (λ e : M, eval (update_evar_val x e ρ) ϕ₁) ⊆ propset_fa_union (λ e : M, eval (update_evar_val x e ρ) ϕ₂)
signature: Signature
M: Model
x: evar
ϕ₁, ϕ₂: Pattern
H: ρ : Valuation, eval ρ ϕ₁ ⊆ eval ρ ϕ₂

ρ : Valuation, propset_fa_union (λ e : M, eval (update_evar_val x e ρ) ϕ₁) ⊆ propset_fa_union (λ e : M, eval (update_evar_val x e ρ) ϕ₂)
induction ϕ₁; intros; apply propset_fa_union_included; auto. Qed. (* eval unchanged when using fresh element varaiable *)
signature: Signature
M: Model
ρ: Valuation
x: evar
v: M
ϕ: Pattern

evar_is_fresh_in x ϕ → eval (update_evar_val x v ρ) ϕ = eval ρ ϕ
signature: Signature
M: Model
ρ: Valuation
x: evar
v: M
ϕ: Pattern

evar_is_fresh_in x ϕ → eval (update_evar_val x v ρ) ϕ = eval ρ ϕ
signature: Signature
M: Model
ρ: Valuation
x: evar
v: M
ϕ: Pattern
Hfr: evar_is_fresh_in x ϕ

eval (update_evar_val x v ρ) ϕ = eval ρ ϕ
signature: Signature
M: Model
ρ: Valuation
x: evar
v: M
ϕ: Pattern
Hfr: x ∉ free_evars ϕ

eval (update_evar_val x v ρ) ϕ = eval ρ ϕ
signature: Signature
M: Model
ρ0: Valuation
x0: evar
v: M
x: evar
Hfr: x0 ∉ {[x]}

{[evar_valuation (update_evar_val x0 v ρ0) x]} = {[evar_valuation ρ0 x]}
signature: Signature
M: Model
ρ0: Valuation
x: evar
v: M
ϕ₁, ϕ₂: Pattern
H: x ∉ free_evars ϕ₁ → eval (update_evar_val x v ρ0) ϕ₁ = eval ρ0 ϕ₁
H0: x ∉ free_evars ϕ₂ → eval (update_evar_val x v ρ0) ϕ₂ = eval ρ0 ϕ₂
Hfr: x ∉ free_evars ϕ₁ ∪ free_evars ϕ₂
Heqcall: app_ext (eval (update_evar_val x v ρ0) ϕ₁) (eval (update_evar_val x v ρ0) ϕ₂) = eval (update_evar_val x v ρ0) (ϕ₁ $ ϕ₂)
app_ext (eval (update_evar_val x v ρ0) ϕ₁) (eval (update_evar_val x v ρ0) ϕ₂) = app_ext (eval ρ0 ϕ₁) (eval ρ0 ϕ₂)
signature: Signature
M: Model
ρ0: Valuation
x: evar
v: M
ϕ₁, ϕ₂: Pattern
H: x ∉ free_evars ϕ₁ → eval (update_evar_val x v ρ0) ϕ₁ = eval ρ0 ϕ₁
H0: x ∉ free_evars ϕ₂ → eval (update_evar_val x v ρ0) ϕ₂ = eval ρ0 ϕ₂
Hfr: x ∉ free_evars ϕ₁ ∪ free_evars ϕ₂
Heqcall: ⊤ ∖ eval (update_evar_val x v ρ0) ϕ₁ ∪ eval (update_evar_val x v ρ0) ϕ₂ = eval (update_evar_val x v ρ0) (ϕ₁ ---> ϕ₂)
⊤ ∖ eval (update_evar_val x v ρ0) ϕ₁ ∪ eval (update_evar_val x v ρ0) ϕ₂ = ⊤ ∖ eval ρ0 ϕ₁ ∪ eval ρ0 ϕ₂
signature: Signature
M: Model
ρ0: Valuation
x: evar
v: M
ϕ': Pattern
H: (e : M) (ρ : Valuation) (x0 : evar) (v0 : M) (ϕ : Pattern), x0 ∉ free_evars ϕ → {| pr1 := update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0); pr2 := ϕ'^{evar:0↦fresh_evar ϕ'} |} = {| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |} → eval (update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'} = eval (update_evar_val x0 v0 ρ) ϕ → eval (update_evar_val x0 v0 ρ) ϕ = eval ρ ϕ
Hfr: x ∉ free_evars ϕ'
Heqcall: propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'}) = eval (update_evar_val x v ρ0) (ex , ϕ')
(let x0 := fresh_evar ϕ' in propset_fa_union (λ e : M, let ρ' := update_evar_val x0 e (update_evar_val x v ρ0) in eval ρ' ϕ'^{evar:0↦x0})) = (let x := fresh_evar ϕ' in propset_fa_union (λ e : M, let ρ' := update_evar_val x e ρ0 in eval ρ' ϕ'^{evar:0↦x}))
signature: Signature
M: Model
ρ0: Valuation
x: evar
v: M
ϕ': Pattern
H: (S : propset M) (ρ : Valuation) (x0 : evar) (v0 : M) (ϕ : Pattern), x0 ∉ free_evars ϕ → {| pr1 := update_svar_val (fresh_svar ϕ') S (update_evar_val x v ρ0); pr2 := ϕ'^{svar:0↦fresh_svar ϕ'} |} = {| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |} → eval (update_svar_val (fresh_svar ϕ') S (update_evar_val x v ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'} = eval (update_evar_val x0 v0 ρ) ϕ → eval (update_evar_val x0 v0 ρ) ϕ = eval ρ ϕ
Hfr: x ∉ free_evars ϕ'
Heqcall: LeastFixpointOf (λ S : propset M, eval (update_svar_val (fresh_svar ϕ') S (update_evar_val x v ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'}) = eval (update_evar_val x v ρ0) (mu , ϕ')
(let X := fresh_svar ϕ' in LeastFixpointOf (λ S : propset M, let ρ' := update_svar_val X S (update_evar_val x v ρ0) in eval ρ' ϕ'^{svar:0↦X})) = (let X := fresh_svar ϕ' in LeastFixpointOf (λ S : propset M, let ρ' := update_svar_val X S ρ0 in eval ρ' ϕ'^{svar:0↦X}))
signature: Signature
M: Model
ρ0: Valuation
x0: evar
v: M
x: evar
Hfr: x0 ∉ {[x]}

{[evar_valuation (update_evar_val x0 v ρ0) x]} = {[evar_valuation ρ0 x]}
signature: Signature
M: Model
ρ0: Valuation
x0: evar
v: M
x: evar
Hfr: x0 ∉ {[x]}

{[if decide (x0 = x) then v else evar_valuation ρ0 x]} = {[evar_valuation ρ0 x]}
signature: Signature
M: Model
ρ0: Valuation
x0: evar
v: M
x: evar
Hfr: x0 ∉ {[x]}
e: x0 = x

{[v]} = {[evar_valuation ρ0 x]}
signature: Signature
M: Model
ρ0: Valuation
x0: evar
v: M
x: evar
Hfr: x0 ∉ {[x]}
n: x0 ≠ x
{[evar_valuation ρ0 x]} = {[evar_valuation ρ0 x]}
signature: Signature
M: Model
ρ0: Valuation
x0: evar
v: M
x: evar
Hfr: x0 ∉ {[x]}
e: x0 = x

{[v]} = {[evar_valuation ρ0 x]}
signature: Signature
M: Model
ρ0: Valuation
v: M
x: evar
Hfr: x ∉ {[x]}

{[v]} = {[evar_valuation ρ0 x]}
signature: Signature
M: Model
ρ0: Valuation
v: M
x: evar
Hfr: x ∉ {[x]}

{[v]} = {[evar_valuation ρ0 x]}
signature: Signature
M: Model
ρ0: Valuation
v: M
x: evar
Hfr: x ∉ {[x]}

{[v]} = {[evar_valuation ρ0 x]}
signature: Signature
M: Model
ρ0: Valuation
v: M
x: evar
Hfr: x ≠ x

{[v]} = {[evar_valuation ρ0 x]}
contradiction.
signature: Signature
M: Model
ρ0: Valuation
x0: evar
v: M
x: evar
Hfr: x0 ∉ {[x]}
n: x0 ≠ x

{[evar_valuation ρ0 x]} = {[evar_valuation ρ0 x]}
reflexivity.
signature: Signature
M: Model
ρ0: Valuation
x: evar
v: M
ϕ₁, ϕ₂: Pattern
H: x ∉ free_evars ϕ₁ → eval (update_evar_val x v ρ0) ϕ₁ = eval ρ0 ϕ₁
H0: x ∉ free_evars ϕ₂ → eval (update_evar_val x v ρ0) ϕ₂ = eval ρ0 ϕ₂
Hfr: x ∉ free_evars ϕ₁ ∪ free_evars ϕ₂
Heqcall: app_ext (eval (update_evar_val x v ρ0) ϕ₁) (eval (update_evar_val x v ρ0) ϕ₂) = eval (update_evar_val x v ρ0) (ϕ₁ $ ϕ₂)

app_ext (eval (update_evar_val x v ρ0) ϕ₁) (eval (update_evar_val x v ρ0) ϕ₂) = app_ext (eval ρ0 ϕ₁) (eval ρ0 ϕ₂)
signature: Signature
M: Model
ρ0: Valuation
x: evar
v: M
ϕ₁, ϕ₂: Pattern
H: x ∉ free_evars ϕ₁ → eval (update_evar_val x v ρ0) ϕ₁ = eval ρ0 ϕ₁
H0: x ∉ free_evars ϕ₂ → eval (update_evar_val x v ρ0) ϕ₂ = eval ρ0 ϕ₂
Hfr: x ∉ free_evars ϕ₁ ∪ free_evars ϕ₂
Heqcall: app_ext (eval (update_evar_val x v ρ0) ϕ₁) (eval (update_evar_val x v ρ0) ϕ₂) = eval (update_evar_val x v ρ0) (ϕ₁ $ ϕ₂)

x ∉ free_evars ϕ₁
signature: Signature
M: Model
ρ0: Valuation
x: evar
v: M
ϕ₁, ϕ₂: Pattern
H: x ∉ free_evars ϕ₁ → eval (update_evar_val x v ρ0) ϕ₁ = eval ρ0 ϕ₁
H0: x ∉ free_evars ϕ₂ → eval (update_evar_val x v ρ0) ϕ₂ = eval ρ0 ϕ₂
Hfr: x ∉ free_evars ϕ₁ ∪ free_evars ϕ₂
Heqcall: app_ext (eval (update_evar_val x v ρ0) ϕ₁) (eval (update_evar_val x v ρ0) ϕ₂) = eval (update_evar_val x v ρ0) (ϕ₁ $ ϕ₂)
app_ext (eval ρ0 ϕ₁) (eval (update_evar_val x v ρ0) ϕ₂) = app_ext (eval ρ0 ϕ₁) (eval ρ0 ϕ₂)
signature: Signature
M: Model
ρ0: Valuation
x: evar
v: M
ϕ₁, ϕ₂: Pattern
H: x ∉ free_evars ϕ₁ → eval (update_evar_val x v ρ0) ϕ₁ = eval ρ0 ϕ₁
H0: x ∉ free_evars ϕ₂ → eval (update_evar_val x v ρ0) ϕ₂ = eval ρ0 ϕ₂
Hfr: x ∉ free_evars ϕ₁ ∪ free_evars ϕ₂
Heqcall: app_ext (eval (update_evar_val x v ρ0) ϕ₁) (eval (update_evar_val x v ρ0) ϕ₂) = eval (update_evar_val x v ρ0) (ϕ₁ $ ϕ₂)

x ∉ free_evars ϕ₁
set_solver.
signature: Signature
M: Model
ρ0: Valuation
x: evar
v: M
ϕ₁, ϕ₂: Pattern
H: x ∉ free_evars ϕ₁ → eval (update_evar_val x v ρ0) ϕ₁ = eval ρ0 ϕ₁
H0: x ∉ free_evars ϕ₂ → eval (update_evar_val x v ρ0) ϕ₂ = eval ρ0 ϕ₂
Hfr: x ∉ free_evars ϕ₁ ∪ free_evars ϕ₂
Heqcall: app_ext (eval (update_evar_val x v ρ0) ϕ₁) (eval (update_evar_val x v ρ0) ϕ₂) = eval (update_evar_val x v ρ0) (ϕ₁ $ ϕ₂)

app_ext (eval ρ0 ϕ₁) (eval (update_evar_val x v ρ0) ϕ₂) = app_ext (eval ρ0 ϕ₁) (eval ρ0 ϕ₂)
signature: Signature
M: Model
ρ0: Valuation
x: evar
v: M
ϕ₁, ϕ₂: Pattern
H: x ∉ free_evars ϕ₁ → eval (update_evar_val x v ρ0) ϕ₁ = eval ρ0 ϕ₁
H0: x ∉ free_evars ϕ₂ → eval (update_evar_val x v ρ0) ϕ₂ = eval ρ0 ϕ₂
Hfr: x ∉ free_evars ϕ₁ ∪ free_evars ϕ₂
Heqcall: app_ext (eval (update_evar_val x v ρ0) ϕ₁) (eval (update_evar_val x v ρ0) ϕ₂) = eval (update_evar_val x v ρ0) (ϕ₁ $ ϕ₂)

x ∉ free_evars ϕ₂
signature: Signature
M: Model
ρ0: Valuation
x: evar
v: M
ϕ₁, ϕ₂: Pattern
H: x ∉ free_evars ϕ₁ → eval (update_evar_val x v ρ0) ϕ₁ = eval ρ0 ϕ₁
H0: x ∉ free_evars ϕ₂ → eval (update_evar_val x v ρ0) ϕ₂ = eval ρ0 ϕ₂
Hfr: x ∉ free_evars ϕ₁ ∪ free_evars ϕ₂
Heqcall: app_ext (eval (update_evar_val x v ρ0) ϕ₁) (eval (update_evar_val x v ρ0) ϕ₂) = eval (update_evar_val x v ρ0) (ϕ₁ $ ϕ₂)
app_ext (eval ρ0 ϕ₁) (eval ρ0 ϕ₂) = app_ext (eval ρ0 ϕ₁) (eval ρ0 ϕ₂)
signature: Signature
M: Model
ρ0: Valuation
x: evar
v: M
ϕ₁, ϕ₂: Pattern
H: x ∉ free_evars ϕ₁ → eval (update_evar_val x v ρ0) ϕ₁ = eval ρ0 ϕ₁
H0: x ∉ free_evars ϕ₂ → eval (update_evar_val x v ρ0) ϕ₂ = eval ρ0 ϕ₂
Hfr: x ∉ free_evars ϕ₁ ∪ free_evars ϕ₂
Heqcall: app_ext (eval (update_evar_val x v ρ0) ϕ₁) (eval (update_evar_val x v ρ0) ϕ₂) = eval (update_evar_val x v ρ0) (ϕ₁ $ ϕ₂)

x ∉ free_evars ϕ₂
set_solver.
signature: Signature
M: Model
ρ0: Valuation
x: evar
v: M
ϕ₁, ϕ₂: Pattern
H: x ∉ free_evars ϕ₁ → eval (update_evar_val x v ρ0) ϕ₁ = eval ρ0 ϕ₁
H0: x ∉ free_evars ϕ₂ → eval (update_evar_val x v ρ0) ϕ₂ = eval ρ0 ϕ₂
Hfr: x ∉ free_evars ϕ₁ ∪ free_evars ϕ₂
Heqcall: app_ext (eval (update_evar_val x v ρ0) ϕ₁) (eval (update_evar_val x v ρ0) ϕ₂) = eval (update_evar_val x v ρ0) (ϕ₁ $ ϕ₂)

app_ext (eval ρ0 ϕ₁) (eval ρ0 ϕ₂) = app_ext (eval ρ0 ϕ₁) (eval ρ0 ϕ₂)
reflexivity.
signature: Signature
M: Model
ρ0: Valuation
x: evar
v: M
ϕ₁, ϕ₂: Pattern
H: x ∉ free_evars ϕ₁ → eval (update_evar_val x v ρ0) ϕ₁ = eval ρ0 ϕ₁
H0: x ∉ free_evars ϕ₂ → eval (update_evar_val x v ρ0) ϕ₂ = eval ρ0 ϕ₂
Hfr: x ∉ free_evars ϕ₁ ∪ free_evars ϕ₂
Heqcall: ⊤ ∖ eval (update_evar_val x v ρ0) ϕ₁ ∪ eval (update_evar_val x v ρ0) ϕ₂ = eval (update_evar_val x v ρ0) (ϕ₁ ---> ϕ₂)

⊤ ∖ eval (update_evar_val x v ρ0) ϕ₁ ∪ eval (update_evar_val x v ρ0) ϕ₂ = ⊤ ∖ eval ρ0 ϕ₁ ∪ eval ρ0 ϕ₂
signature: Signature
M: Model
ρ0: Valuation
x: evar
v: M
ϕ₁, ϕ₂: Pattern
H: x ∉ free_evars ϕ₁ → eval (update_evar_val x v ρ0) ϕ₁ = eval ρ0 ϕ₁
H0: x ∉ free_evars ϕ₂ → eval (update_evar_val x v ρ0) ϕ₂ = eval ρ0 ϕ₂
Hfr: x ∉ free_evars ϕ₁ ∪ free_evars ϕ₂
Heqcall: ⊤ ∖ eval (update_evar_val x v ρ0) ϕ₁ ∪ eval (update_evar_val x v ρ0) ϕ₂ = eval (update_evar_val x v ρ0) (ϕ₁ ---> ϕ₂)

x ∉ free_evars ϕ₁
signature: Signature
M: Model
ρ0: Valuation
x: evar
v: M
ϕ₁, ϕ₂: Pattern
H: x ∉ free_evars ϕ₁ → eval (update_evar_val x v ρ0) ϕ₁ = eval ρ0 ϕ₁
H0: x ∉ free_evars ϕ₂ → eval (update_evar_val x v ρ0) ϕ₂ = eval ρ0 ϕ₂
Hfr: x ∉ free_evars ϕ₁ ∪ free_evars ϕ₂
Heqcall: ⊤ ∖ eval (update_evar_val x v ρ0) ϕ₁ ∪ eval (update_evar_val x v ρ0) ϕ₂ = eval (update_evar_val x v ρ0) (ϕ₁ ---> ϕ₂)
⊤ ∖ eval ρ0 ϕ₁ ∪ eval (update_evar_val x v ρ0) ϕ₂ = ⊤ ∖ eval ρ0 ϕ₁ ∪ eval ρ0 ϕ₂
signature: Signature
M: Model
ρ0: Valuation
x: evar
v: M
ϕ₁, ϕ₂: Pattern
H: x ∉ free_evars ϕ₁ → eval (update_evar_val x v ρ0) ϕ₁ = eval ρ0 ϕ₁
H0: x ∉ free_evars ϕ₂ → eval (update_evar_val x v ρ0) ϕ₂ = eval ρ0 ϕ₂
Hfr: x ∉ free_evars ϕ₁ ∪ free_evars ϕ₂
Heqcall: ⊤ ∖ eval (update_evar_val x v ρ0) ϕ₁ ∪ eval (update_evar_val x v ρ0) ϕ₂ = eval (update_evar_val x v ρ0) (ϕ₁ ---> ϕ₂)

x ∉ free_evars ϕ₁
set_solver.
signature: Signature
M: Model
ρ0: Valuation
x: evar
v: M
ϕ₁, ϕ₂: Pattern
H: x ∉ free_evars ϕ₁ → eval (update_evar_val x v ρ0) ϕ₁ = eval ρ0 ϕ₁
H0: x ∉ free_evars ϕ₂ → eval (update_evar_val x v ρ0) ϕ₂ = eval ρ0 ϕ₂
Hfr: x ∉ free_evars ϕ₁ ∪ free_evars ϕ₂
Heqcall: ⊤ ∖ eval (update_evar_val x v ρ0) ϕ₁ ∪ eval (update_evar_val x v ρ0) ϕ₂ = eval (update_evar_val x v ρ0) (ϕ₁ ---> ϕ₂)

⊤ ∖ eval ρ0 ϕ₁ ∪ eval (update_evar_val x v ρ0) ϕ₂ = ⊤ ∖ eval ρ0 ϕ₁ ∪ eval ρ0 ϕ₂
signature: Signature
M: Model
ρ0: Valuation
x: evar
v: M
ϕ₁, ϕ₂: Pattern
H: x ∉ free_evars ϕ₁ → eval (update_evar_val x v ρ0) ϕ₁ = eval ρ0 ϕ₁
H0: x ∉ free_evars ϕ₂ → eval (update_evar_val x v ρ0) ϕ₂ = eval ρ0 ϕ₂
Hfr: x ∉ free_evars ϕ₁ ∪ free_evars ϕ₂
Heqcall: ⊤ ∖ eval (update_evar_val x v ρ0) ϕ₁ ∪ eval (update_evar_val x v ρ0) ϕ₂ = eval (update_evar_val x v ρ0) (ϕ₁ ---> ϕ₂)

x ∉ free_evars ϕ₂
signature: Signature
M: Model
ρ0: Valuation
x: evar
v: M
ϕ₁, ϕ₂: Pattern
H: x ∉ free_evars ϕ₁ → eval (update_evar_val x v ρ0) ϕ₁ = eval ρ0 ϕ₁
H0: x ∉ free_evars ϕ₂ → eval (update_evar_val x v ρ0) ϕ₂ = eval ρ0 ϕ₂
Hfr: x ∉ free_evars ϕ₁ ∪ free_evars ϕ₂
Heqcall: ⊤ ∖ eval (update_evar_val x v ρ0) ϕ₁ ∪ eval (update_evar_val x v ρ0) ϕ₂ = eval (update_evar_val x v ρ0) (ϕ₁ ---> ϕ₂)
⊤ ∖ eval ρ0 ϕ₁ ∪ eval ρ0 ϕ₂ = ⊤ ∖ eval ρ0 ϕ₁ ∪ eval ρ0 ϕ₂
signature: Signature
M: Model
ρ0: Valuation
x: evar
v: M
ϕ₁, ϕ₂: Pattern
H: x ∉ free_evars ϕ₁ → eval (update_evar_val x v ρ0) ϕ₁ = eval ρ0 ϕ₁
H0: x ∉ free_evars ϕ₂ → eval (update_evar_val x v ρ0) ϕ₂ = eval ρ0 ϕ₂
Hfr: x ∉ free_evars ϕ₁ ∪ free_evars ϕ₂
Heqcall: ⊤ ∖ eval (update_evar_val x v ρ0) ϕ₁ ∪ eval (update_evar_val x v ρ0) ϕ₂ = eval (update_evar_val x v ρ0) (ϕ₁ ---> ϕ₂)

x ∉ free_evars ϕ₂
set_solver.
signature: Signature
M: Model
ρ0: Valuation
x: evar
v: M
ϕ₁, ϕ₂: Pattern
H: x ∉ free_evars ϕ₁ → eval (update_evar_val x v ρ0) ϕ₁ = eval ρ0 ϕ₁
H0: x ∉ free_evars ϕ₂ → eval (update_evar_val x v ρ0) ϕ₂ = eval ρ0 ϕ₂
Hfr: x ∉ free_evars ϕ₁ ∪ free_evars ϕ₂
Heqcall: ⊤ ∖ eval (update_evar_val x v ρ0) ϕ₁ ∪ eval (update_evar_val x v ρ0) ϕ₂ = eval (update_evar_val x v ρ0) (ϕ₁ ---> ϕ₂)

⊤ ∖ eval ρ0 ϕ₁ ∪ eval ρ0 ϕ₂ = ⊤ ∖ eval ρ0 ϕ₁ ∪ eval ρ0 ϕ₂
reflexivity.
signature: Signature
M: Model
ρ0: Valuation
x: evar
v: M
ϕ': Pattern
H: (e : M) (ρ : Valuation) (x0 : evar) (v0 : M) (ϕ : Pattern), x0 ∉ free_evars ϕ → {| pr1 := update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0); pr2 := ϕ'^{evar:0↦fresh_evar ϕ'} |} = {| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |} → eval (update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'} = eval (update_evar_val x0 v0 ρ) ϕ → eval (update_evar_val x0 v0 ρ) ϕ = eval ρ ϕ
Hfr: x ∉ free_evars ϕ'
Heqcall: propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'}) = eval (update_evar_val x v ρ0) (ex , ϕ')

(let x0 := fresh_evar ϕ' in propset_fa_union (λ e : M, let ρ' := update_evar_val x0 e (update_evar_val x v ρ0) in eval ρ' ϕ'^{evar:0↦x0})) = (let x := fresh_evar ϕ' in propset_fa_union (λ e : M, let ρ' := update_evar_val x e ρ0 in eval ρ' ϕ'^{evar:0↦x}))
signature: Signature
M: Model
ρ0: Valuation
x: evar
v: M
ϕ': Pattern
H: (e : M) (ρ : Valuation) (x0 : evar) (v0 : M) (ϕ : Pattern), x0 ∉ free_evars ϕ → {| pr1 := update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0); pr2 := ϕ'^{evar:0↦fresh_evar ϕ'} |} = {| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |} → eval (update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'} = eval (update_evar_val x0 v0 ρ) ϕ → eval (update_evar_val x0 v0 ρ) ϕ = eval ρ ϕ
Hfr: x ∉ free_evars ϕ'
Heqcall: propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'}) = eval (update_evar_val x v ρ0) (ex , ϕ')

propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'}) = propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ') e ρ0) ϕ'^{evar:0↦fresh_evar ϕ'})
signature: Signature
M: Model
ρ0: Valuation
x: evar
v: M
ϕ': Pattern
H: (e : M) (ρ : Valuation) (x0 : evar) (v0 : M) (ϕ : Pattern), x0 ∉ free_evars ϕ → {| pr1 := update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0); pr2 := ϕ'^{evar:0↦fresh_evar ϕ'} |} = {| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |} → eval (update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'} = eval (update_evar_val x0 v0 ρ) ϕ → eval (update_evar_val x0 v0 ρ) ϕ = eval ρ ϕ
Hfr: x ∉ free_evars ϕ'
Heqcall: propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'}) = eval (update_evar_val x v ρ0) (ex , ϕ')

(λ e : M, eval (update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'}) = (λ e : M, eval (update_evar_val (fresh_evar ϕ') e ρ0) ϕ'^{evar:0↦fresh_evar ϕ'})
signature: Signature
M: Model
ρ0: Valuation
x: evar
v: M
ϕ': Pattern
H: (e : M) (ρ : Valuation) (x0 : evar) (v0 : M) (ϕ : Pattern), x0 ∉ free_evars ϕ → {| pr1 := update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0); pr2 := ϕ'^{evar:0↦fresh_evar ϕ'} |} = {| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |} → eval (update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'} = eval (update_evar_val x0 v0 ρ) ϕ → eval (update_evar_val x0 v0 ρ) ϕ = eval ρ ϕ
Hfr: x ∉ free_evars ϕ'
Heqcall: propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'}) = eval (update_evar_val x v ρ0) (ex , ϕ')

x0 : M, eval (update_evar_val (fresh_evar ϕ') x0 (update_evar_val x v ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'} = eval (update_evar_val (fresh_evar ϕ') x0 ρ0) ϕ'^{evar:0↦fresh_evar ϕ'}
signature: Signature
M: Model
ρ0: Valuation
x: evar
v: M
ϕ': Pattern
H: (e : M) (ρ : Valuation) (x0 : evar) (v0 : M) (ϕ : Pattern), x0 ∉ free_evars ϕ → {| pr1 := update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0); pr2 := ϕ'^{evar:0↦fresh_evar ϕ'} |} = {| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |} → eval (update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'} = eval (update_evar_val x0 v0 ρ) ϕ → eval (update_evar_val x0 v0 ρ) ϕ = eval ρ ϕ
Hfr: x ∉ free_evars ϕ'
Heqcall: propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'}) = eval (update_evar_val x v ρ0) (ex , ϕ')
e: M

eval (update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'} = eval (update_evar_val (fresh_evar ϕ') e ρ0) ϕ'^{evar:0↦fresh_evar ϕ'}
signature: Signature
M: Model
ρ0: Valuation
x: evar
v: M
ϕ': Pattern
H: (e : M) (ρ : Valuation) (x0 : evar) (v0 : M) (ϕ : Pattern), x0 ∉ free_evars ϕ → {| pr1 := update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0); pr2 := ϕ'^{evar:0↦fresh_evar ϕ'} |} = {| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |} → eval (update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'} = eval (update_evar_val x0 v0 ρ) ϕ → eval (update_evar_val x0 v0 ρ) ϕ = eval ρ ϕ
Hfr: x ∉ free_evars ϕ'
Heqcall: propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'}) = eval (update_evar_val x v ρ0) (ex , ϕ')
e: M
Heq: fresh_evar ϕ' = x

eval (update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'} = eval (update_evar_val (fresh_evar ϕ') e ρ0) ϕ'^{evar:0↦fresh_evar ϕ'}
signature: Signature
M: Model
ρ0: Valuation
x: evar
v: M
ϕ': Pattern
H: (e : M) (ρ : Valuation) (x0 : evar) (v0 : M) (ϕ : Pattern), x0 ∉ free_evars ϕ → {| pr1 := update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0); pr2 := ϕ'^{evar:0↦fresh_evar ϕ'} |} = {| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |} → eval (update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'} = eval (update_evar_val x0 v0 ρ) ϕ → eval (update_evar_val x0 v0 ρ) ϕ = eval ρ ϕ
Hfr: x ∉ free_evars ϕ'
Heqcall: propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'}) = eval (update_evar_val x v ρ0) (ex , ϕ')
e: M
Hneq: fresh_evar ϕ' ≠ x
eval (update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'} = eval (update_evar_val (fresh_evar ϕ') e ρ0) ϕ'^{evar:0↦fresh_evar ϕ'}
signature: Signature
M: Model
ρ0: Valuation
x: evar
v: M
ϕ': Pattern
H: (e : M) (ρ : Valuation) (x0 : evar) (v0 : M) (ϕ : Pattern), x0 ∉ free_evars ϕ → {| pr1 := update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0); pr2 := ϕ'^{evar:0↦fresh_evar ϕ'} |} = {| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |} → eval (update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'} = eval (update_evar_val x0 v0 ρ) ϕ → eval (update_evar_val x0 v0 ρ) ϕ = eval ρ ϕ
Hfr: x ∉ free_evars ϕ'
Heqcall: propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'}) = eval (update_evar_val x v ρ0) (ex , ϕ')
e: M
Heq: fresh_evar ϕ' = x

eval (update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'} = eval (update_evar_val (fresh_evar ϕ') e ρ0) ϕ'^{evar:0↦fresh_evar ϕ'}
signature: Signature
M: Model
ρ0: Valuation
x: evar
v: M
ϕ': Pattern
H: (e : M) (ρ : Valuation) (x0 : evar) (v0 : M) (ϕ : Pattern), x0 ∉ free_evars ϕ → {| pr1 := update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0); pr2 := ϕ'^{evar:0↦fresh_evar ϕ'} |} = {| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |} → eval (update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'} = eval (update_evar_val x0 v0 ρ) ϕ → eval (update_evar_val x0 v0 ρ) ϕ = eval ρ ϕ
Hfr: x ∉ free_evars ϕ'
Heqcall: propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'}) = eval (update_evar_val x v ρ0) (ex , ϕ')
e: M
Heq: fresh_evar ϕ' = x

eval (update_evar_val x e (update_evar_val x v ρ0)) ϕ'^{evar:0↦x} = eval (update_evar_val x e ρ0) ϕ'^{evar:0↦x}
signature: Signature
M: Model
ρ0: Valuation
x: evar
v: M
ϕ': Pattern
H: (e : M) (ρ : Valuation) (x0 : evar) (v0 : M) (ϕ : Pattern), x0 ∉ free_evars ϕ → {| pr1 := update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0); pr2 := ϕ'^{evar:0↦fresh_evar ϕ'} |} = {| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |} → eval (update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'} = eval (update_evar_val x0 v0 ρ) ϕ → eval (update_evar_val x0 v0 ρ) ϕ = eval ρ ϕ
Hfr: x ∉ free_evars ϕ'
Heqcall: propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'}) = eval (update_evar_val x v ρ0) (ex , ϕ')
e: M
Heq: fresh_evar ϕ' = x

eval (update_evar_val x e ρ0) ϕ'^{evar:0↦x} = eval (update_evar_val x e ρ0) ϕ'^{evar:0↦x}
reflexivity.
signature: Signature
M: Model
ρ0: Valuation
x: evar
v: M
ϕ': Pattern
H: (e : M) (ρ : Valuation) (x0 : evar) (v0 : M) (ϕ : Pattern), x0 ∉ free_evars ϕ → {| pr1 := update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0); pr2 := ϕ'^{evar:0↦fresh_evar ϕ'} |} = {| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |} → eval (update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'} = eval (update_evar_val x0 v0 ρ) ϕ → eval (update_evar_val x0 v0 ρ) ϕ = eval ρ ϕ
Hfr: x ∉ free_evars ϕ'
Heqcall: propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'}) = eval (update_evar_val x v ρ0) (ex , ϕ')
e: M
Hneq: fresh_evar ϕ' ≠ x

eval (update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'} = eval (update_evar_val (fresh_evar ϕ') e ρ0) ϕ'^{evar:0↦fresh_evar ϕ'}
signature: Signature
M: Model
ρ0: Valuation
x: evar
v: M
ϕ': Pattern
H: (e : M) (ρ : Valuation) (x0 : evar) (v0 : M) (ϕ : Pattern), x0 ∉ free_evars ϕ → {| pr1 := update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0); pr2 := ϕ'^{evar:0↦fresh_evar ϕ'} |} = {| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |} → eval (update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'} = eval (update_evar_val x0 v0 ρ) ϕ → eval (update_evar_val x0 v0 ρ) ϕ = eval ρ ϕ
Hfr: x ∉ free_evars ϕ'
Heqcall: propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'}) = eval (update_evar_val x v ρ0) (ex , ϕ')
e: M
Hneq: fresh_evar ϕ' ≠ x

eval (update_evar_val x v (update_evar_val (fresh_evar ϕ') e ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'} = eval (update_evar_val (fresh_evar ϕ') e ρ0) ϕ'^{evar:0↦fresh_evar ϕ'}
signature: Signature
M: Model
ρ0: Valuation
x: evar
v: M
ϕ': Pattern
H: (e : M) (ρ : Valuation) (x0 : evar) (v0 : M) (ϕ : Pattern), x0 ∉ free_evars ϕ → {| pr1 := update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0); pr2 := ϕ'^{evar:0↦fresh_evar ϕ'} |} = {| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |} → eval (update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'} = eval (update_evar_val x0 v0 ρ) ϕ → eval (update_evar_val x0 v0 ρ) ϕ = eval ρ ϕ
Hfr: x ∉ free_evars ϕ'
Heqcall: propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'}) = eval (update_evar_val x v ρ0) (ex , ϕ')
e: M
Hneq: fresh_evar ϕ' ≠ x
fresh_evar ϕ' ≠ x
signature: Signature
M: Model
ρ0: Valuation
x: evar
v: M
ϕ': Pattern
H: (e : M) (ρ : Valuation) (x0 : evar) (v0 : M) (ϕ : Pattern), x0 ∉ free_evars ϕ → {| pr1 := update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0); pr2 := ϕ'^{evar:0↦fresh_evar ϕ'} |} = {| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |} → eval (update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'} = eval (update_evar_val x0 v0 ρ) ϕ → eval (update_evar_val x0 v0 ρ) ϕ = eval ρ ϕ
Hfr: x ∉ free_evars ϕ'
Heqcall: propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'}) = eval (update_evar_val x v ρ0) (ex , ϕ')
e: M
Hneq: fresh_evar ϕ' ≠ x

eval (update_evar_val x v (update_evar_val (fresh_evar ϕ') e ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'} = eval (update_evar_val (fresh_evar ϕ') e ρ0) ϕ'^{evar:0↦fresh_evar ϕ'}
signature: Signature
M: Model
ρ0: Valuation
x: evar
v: M
ϕ': Pattern
H: (e : M) (ρ : Valuation) (x0 : evar) (v0 : M) (ϕ : Pattern), x0 ∉ free_evars ϕ → {| pr1 := update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0); pr2 := ϕ'^{evar:0↦fresh_evar ϕ'} |} = {| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |} → eval (update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'} = eval (update_evar_val x0 v0 ρ) ϕ → eval (update_evar_val x0 v0 ρ) ϕ = eval ρ ϕ
Hfr: x ∉ free_evars ϕ'
Heqcall: propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'}) = eval (update_evar_val x v ρ0) (ex , ϕ')
e: M
Hneq: fresh_evar ϕ' ≠ x

eval (update_evar_val (fresh_evar ϕ') e ρ0) ϕ'^{evar:0↦fresh_evar ϕ'} = eval (update_evar_val (fresh_evar ϕ') e ρ0) ϕ'^{evar:0↦fresh_evar ϕ'}
signature: Signature
M: Model
ρ0: Valuation
x: evar
v: M
ϕ': Pattern
H: (e : M) (ρ : Valuation) (x0 : evar) (v0 : M) (ϕ : Pattern), x0 ∉ free_evars ϕ → {| pr1 := update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0); pr2 := ϕ'^{evar:0↦fresh_evar ϕ'} |} = {| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |} → eval (update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'} = eval (update_evar_val x0 v0 ρ) ϕ → eval (update_evar_val x0 v0 ρ) ϕ = eval ρ ϕ
Hfr: x ∉ free_evars ϕ'
Heqcall: propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'}) = eval (update_evar_val x v ρ0) (ex , ϕ')
e: M
Hneq: fresh_evar ϕ' ≠ x
x ∉ free_evars ϕ'^{evar:0↦fresh_evar ϕ'}
signature: Signature
M: Model
ρ0: Valuation
x: evar
v: M
ϕ': Pattern
H: (e : M) (ρ : Valuation) (x0 : evar) (v0 : M) (ϕ : Pattern), x0 ∉ free_evars ϕ → {| pr1 := update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0); pr2 := ϕ'^{evar:0↦fresh_evar ϕ'} |} = {| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |} → eval (update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'} = eval (update_evar_val x0 v0 ρ) ϕ → eval (update_evar_val x0 v0 ρ) ϕ = eval ρ ϕ
Hfr: x ∉ free_evars ϕ'
Heqcall: propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'}) = eval (update_evar_val x v ρ0) (ex , ϕ')
e: M
Hneq: fresh_evar ϕ' ≠ x
{| pr1 := update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0); pr2 := ϕ'^{evar:0↦fresh_evar ϕ'} |} = {| pr1 := update_evar_val x v (update_evar_val (fresh_evar ϕ') e ρ0); pr2 := ϕ'^{evar:0↦fresh_evar ϕ'} |}
signature: Signature
M: Model
ρ0: Valuation
x: evar
v: M
ϕ': Pattern
H: (e : M) (ρ : Valuation) (x0 : evar) (v0 : M) (ϕ : Pattern), x0 ∉ free_evars ϕ → {| pr1 := update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0); pr2 := ϕ'^{evar:0↦fresh_evar ϕ'} |} = {| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |} → eval (update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'} = eval (update_evar_val x0 v0 ρ) ϕ → eval (update_evar_val x0 v0 ρ) ϕ = eval ρ ϕ
Hfr: x ∉ free_evars ϕ'
Heqcall: propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'}) = eval (update_evar_val x v ρ0) (ex , ϕ')
e: M
Hneq: fresh_evar ϕ' ≠ x
eval (update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'} = eval (update_evar_val x v (update_evar_val (fresh_evar ϕ') e ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'}
signature: Signature
M: Model
ρ0: Valuation
x: evar
v: M
ϕ': Pattern
H: (e : M) (ρ : Valuation) (x0 : evar) (v0 : M) (ϕ : Pattern), x0 ∉ free_evars ϕ → {| pr1 := update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0); pr2 := ϕ'^{evar:0↦fresh_evar ϕ'} |} = {| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |} → eval (update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'} = eval (update_evar_val x0 v0 ρ) ϕ → eval (update_evar_val x0 v0 ρ) ϕ = eval ρ ϕ
Hfr: x ∉ free_evars ϕ'
Heqcall: propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'}) = eval (update_evar_val x v ρ0) (ex , ϕ')
e: M
Hneq: fresh_evar ϕ' ≠ x

eval (update_evar_val (fresh_evar ϕ') e ρ0) ϕ'^{evar:0↦fresh_evar ϕ'} = eval (update_evar_val (fresh_evar ϕ') e ρ0) ϕ'^{evar:0↦fresh_evar ϕ'}
reflexivity.
signature: Signature
M: Model
ρ0: Valuation
x: evar
v: M
ϕ': Pattern
H: (e : M) (ρ : Valuation) (x0 : evar) (v0 : M) (ϕ : Pattern), x0 ∉ free_evars ϕ → {| pr1 := update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0); pr2 := ϕ'^{evar:0↦fresh_evar ϕ'} |} = {| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |} → eval (update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'} = eval (update_evar_val x0 v0 ρ) ϕ → eval (update_evar_val x0 v0 ρ) ϕ = eval ρ ϕ
Hfr: x ∉ free_evars ϕ'
Heqcall: propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'}) = eval (update_evar_val x v ρ0) (ex , ϕ')
e: M
Hneq: fresh_evar ϕ' ≠ x

x ∉ free_evars ϕ'^{evar:0↦fresh_evar ϕ'}
signature: Signature
M: Model
ρ0: Valuation
x: evar
v: M
ϕ': Pattern
H: (e : M) (ρ : Valuation) (x0 : evar) (v0 : M) (ϕ : Pattern), x0 ∉ free_evars ϕ → {| pr1 := update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0); pr2 := ϕ'^{evar:0↦fresh_evar ϕ'} |} = {| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |} → eval (update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'} = eval (update_evar_val x0 v0 ρ) ϕ → eval (update_evar_val x0 v0 ρ) ϕ = eval ρ ϕ
Hfr: x ∉ free_evars ϕ'
Heqcall: propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'}) = eval (update_evar_val x v ρ0) (ex , ϕ')
e: M
Hneq: fresh_evar ϕ' ≠ x
{| pr1 := update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0); pr2 := ϕ'^{evar:0↦fresh_evar ϕ'} |} = {| pr1 := update_evar_val x v (update_evar_val (fresh_evar ϕ') e ρ0); pr2 := ϕ'^{evar:0↦fresh_evar ϕ'} |}
signature: Signature
M: Model
ρ0: Valuation
x: evar
v: M
ϕ': Pattern
H: (e : M) (ρ : Valuation) (x0 : evar) (v0 : M) (ϕ : Pattern), x0 ∉ free_evars ϕ → {| pr1 := update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0); pr2 := ϕ'^{evar:0↦fresh_evar ϕ'} |} = {| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |} → eval (update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'} = eval (update_evar_val x0 v0 ρ) ϕ → eval (update_evar_val x0 v0 ρ) ϕ = eval ρ ϕ
Hfr: x ∉ free_evars ϕ'
Heqcall: propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'}) = eval (update_evar_val x v ρ0) (ex , ϕ')
e: M
Hneq: fresh_evar ϕ' ≠ x
eval (update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'} = eval (update_evar_val x v (update_evar_val (fresh_evar ϕ') e ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'}
signature: Signature
M: Model
ρ0: Valuation
x: evar
v: M
ϕ': Pattern
H: (e : M) (ρ : Valuation) (x0 : evar) (v0 : M) (ϕ : Pattern), x0 ∉ free_evars ϕ → {| pr1 := update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0); pr2 := ϕ'^{evar:0↦fresh_evar ϕ'} |} = {| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |} → eval (update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'} = eval (update_evar_val x0 v0 ρ) ϕ → eval (update_evar_val x0 v0 ρ) ϕ = eval ρ ϕ
Hfr: x ∉ free_evars ϕ'
Heqcall: propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'}) = eval (update_evar_val x v ρ0) (ex , ϕ')
e: M
Hneq: fresh_evar ϕ' ≠ x

x ∉ free_evars ϕ'^{evar:0↦fresh_evar ϕ'}
signature: Signature
M: Model
ρ0: Valuation
x: evar
v: M
ϕ': Pattern
H: (e : M) (ρ : Valuation) (x0 : evar) (v0 : M) (ϕ : Pattern), x0 ∉ free_evars ϕ → {| pr1 := update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0); pr2 := ϕ'^{evar:0↦fresh_evar ϕ'} |} = {| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |} → eval (update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'} = eval (update_evar_val x0 v0 ρ) ϕ → eval (update_evar_val x0 v0 ρ) ϕ = eval ρ ϕ
Hfr: x ∉ free_evars ϕ'
Heqcall: propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'}) = eval (update_evar_val x v ρ0) (ex , ϕ')
e: M
Hneq: fresh_evar ϕ' ≠ x
Contra: x ∈ free_evars ϕ'^{evar:0↦fresh_evar ϕ'}

False
signature: Signature
M: Model
ρ0: Valuation
x: evar
v: M
ϕ': Pattern
H: (e : M) (ρ : Valuation) (x0 : evar) (v0 : M) (ϕ : Pattern), x0 ∉ free_evars ϕ → {| pr1 := update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0); pr2 := ϕ'^{evar:0↦fresh_evar ϕ'} |} = {| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |} → eval (update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'} = eval (update_evar_val x0 v0 ρ) ϕ → eval (update_evar_val x0 v0 ρ) ϕ = eval ρ ϕ
Hfr: x ∉ free_evars ϕ'
Heqcall: propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'}) = eval (update_evar_val x v ρ0) (ex , ϕ')
e: M
Hneq: fresh_evar ϕ' ≠ x
Contra: x ∈ free_evars ϕ'^{evar:0↦fresh_evar ϕ'}
Hfeeo: free_evars ϕ'^{evar:0↦fresh_evar ϕ'} ⊆ {[fresh_evar ϕ']} ∪ free_evars ϕ'

False
signature: Signature
M: Model
ρ0: Valuation
x: evar
v: M
ϕ': Pattern
H: (e : M) (ρ : Valuation) (x0 : evar) (v0 : M) (ϕ : Pattern), x0 ∉ free_evars ϕ → {| pr1 := update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0); pr2 := ϕ'^{evar:0↦fresh_evar ϕ'} |} = {| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |} → eval (update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'} = eval (update_evar_val x0 v0 ρ) ϕ → eval (update_evar_val x0 v0 ρ) ϕ = eval ρ ϕ
Hfr: x ∉ free_evars ϕ'
Heqcall: propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'}) = eval (update_evar_val x v ρ0) (ex , ϕ')
e: M
Hneq: fresh_evar ϕ' ≠ x
Contra: x ∈ free_evars ϕ'^{evar:0↦fresh_evar ϕ'}
Hfeeo: x : evar, x ∈ free_evars ϕ'^{evar:0↦fresh_evar ϕ'} → x ∈ {[fresh_evar ϕ']} ∪ free_evars ϕ'

False
signature: Signature
M: Model
ρ0: Valuation
x: evar
v: M
ϕ': Pattern
H: (e : M) (ρ : Valuation) (x0 : evar) (v0 : M) (ϕ : Pattern), x0 ∉ free_evars ϕ → {| pr1 := update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0); pr2 := ϕ'^{evar:0↦fresh_evar ϕ'} |} = {| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |} → eval (update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'} = eval (update_evar_val x0 v0 ρ) ϕ → eval (update_evar_val x0 v0 ρ) ϕ = eval ρ ϕ
Hfr: x ∉ free_evars ϕ'
Heqcall: propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'}) = eval (update_evar_val x v ρ0) (ex , ϕ')
e: M
Hneq: fresh_evar ϕ' ≠ x
Contra: x ∈ free_evars ϕ'^{evar:0↦fresh_evar ϕ'}
Hfeeo: x ∈ {[fresh_evar ϕ']} ∪ free_evars ϕ'

False
signature: Signature
M: Model
ρ0: Valuation
x: evar
v: M
ϕ': Pattern
H: (e : M) (ρ : Valuation) (x0 : evar) (v0 : M) (ϕ : Pattern), x0 ∉ free_evars ϕ → {| pr1 := update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0); pr2 := ϕ'^{evar:0↦fresh_evar ϕ'} |} = {| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |} → eval (update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'} = eval (update_evar_val x0 v0 ρ) ϕ → eval (update_evar_val x0 v0 ρ) ϕ = eval ρ ϕ
Hfr: x ∉ free_evars ϕ'
Heqcall: propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'}) = eval (update_evar_val x v ρ0) (ex , ϕ')
e: M
Hneq: fresh_evar ϕ' ≠ x
Contra: x ∈ free_evars ϕ'^{evar:0↦fresh_evar ϕ'}
Hfeeo: x ∈ {[fresh_evar ϕ']} ∨ x ∈ free_evars ϕ'

False
signature: Signature
M: Model
ρ0: Valuation
x: evar
v: M
ϕ': Pattern
H: (e : M) (ρ : Valuation) (x0 : evar) (v0 : M) (ϕ : Pattern), x0 ∉ free_evars ϕ → {| pr1 := update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0); pr2 := ϕ'^{evar:0↦fresh_evar ϕ'} |} = {| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |} → eval (update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'} = eval (update_evar_val x0 v0 ρ) ϕ → eval (update_evar_val x0 v0 ρ) ϕ = eval ρ ϕ
Hfr: x ∉ free_evars ϕ'
Heqcall: propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'}) = eval (update_evar_val x v ρ0) (ex , ϕ')
e: M
Hneq: fresh_evar ϕ' ≠ x
Contra: x ∈ free_evars ϕ'^{evar:0↦fresh_evar ϕ'}
H': x ∈ {[fresh_evar ϕ']}

False
signature: Signature
M: Model
ρ0: Valuation
x: evar
v: M
ϕ': Pattern
H: (e : M) (ρ : Valuation) (x0 : evar) (v0 : M) (ϕ : Pattern), x0 ∉ free_evars ϕ → {| pr1 := update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0); pr2 := ϕ'^{evar:0↦fresh_evar ϕ'} |} = {| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |} → eval (update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'} = eval (update_evar_val x0 v0 ρ) ϕ → eval (update_evar_val x0 v0 ρ) ϕ = eval ρ ϕ
Hfr: x ∉ free_evars ϕ'
Heqcall: propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'}) = eval (update_evar_val x v ρ0) (ex , ϕ')
e: M
Hneq: fresh_evar ϕ' ≠ x
Contra: x ∈ free_evars ϕ'^{evar:0↦fresh_evar ϕ'}
H': x ∈ free_evars ϕ'
False
signature: Signature
M: Model
ρ0: Valuation
x: evar
v: M
ϕ': Pattern
H: (e : M) (ρ : Valuation) (x0 : evar) (v0 : M) (ϕ : Pattern), x0 ∉ free_evars ϕ → {| pr1 := update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0); pr2 := ϕ'^{evar:0↦fresh_evar ϕ'} |} = {| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |} → eval (update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'} = eval (update_evar_val x0 v0 ρ) ϕ → eval (update_evar_val x0 v0 ρ) ϕ = eval ρ ϕ
Hfr: x ∉ free_evars ϕ'
Heqcall: propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'}) = eval (update_evar_val x v ρ0) (ex , ϕ')
e: M
Hneq: fresh_evar ϕ' ≠ x
Contra: x ∈ free_evars ϕ'^{evar:0↦fresh_evar ϕ'}
H': x ∈ {[fresh_evar ϕ']}

False
signature: Signature
M: Model
ρ0: Valuation
x: evar
v: M
ϕ': Pattern
H: (e : M) (ρ : Valuation) (x0 : evar) (v0 : M) (ϕ : Pattern), x0 ∉ free_evars ϕ → {| pr1 := update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0); pr2 := ϕ'^{evar:0↦fresh_evar ϕ'} |} = {| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |} → eval (update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'} = eval (update_evar_val x0 v0 ρ) ϕ → eval (update_evar_val x0 v0 ρ) ϕ = eval ρ ϕ
Hfr: x ∉ free_evars ϕ'
Heqcall: propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'}) = eval (update_evar_val x v ρ0) (ex , ϕ')
e: M
Hneq: fresh_evar ϕ' ≠ x
Contra: x ∈ free_evars ϕ'^{evar:0↦fresh_evar ϕ'}
H': x = fresh_evar ϕ'

False
signature: Signature
M: Model
ρ0: Valuation
x: evar
v: M
ϕ': Pattern
H: (e : M) (ρ : Valuation) (x0 : evar) (v0 : M) (ϕ : Pattern), x0 ∉ free_evars ϕ → {| pr1 := update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0); pr2 := ϕ'^{evar:0↦fresh_evar ϕ'} |} = {| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |} → eval (update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'} = eval (update_evar_val x0 v0 ρ) ϕ → eval (update_evar_val x0 v0 ρ) ϕ = eval ρ ϕ
Hfr: x ∉ free_evars ϕ'
Heqcall: propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'}) = eval (update_evar_val x v ρ0) (ex , ϕ')
e: M
Hneq: fresh_evar ϕ' ≠ x
Contra: x ∈ free_evars ϕ'^{evar:0↦fresh_evar ϕ'}
H': fresh_evar ϕ' = x

False
contradiction.
signature: Signature
M: Model
ρ0: Valuation
x: evar
v: M
ϕ': Pattern
H: (e : M) (ρ : Valuation) (x0 : evar) (v0 : M) (ϕ : Pattern), x0 ∉ free_evars ϕ → {| pr1 := update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0); pr2 := ϕ'^{evar:0↦fresh_evar ϕ'} |} = {| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |} → eval (update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'} = eval (update_evar_val x0 v0 ρ) ϕ → eval (update_evar_val x0 v0 ρ) ϕ = eval ρ ϕ
Hfr: x ∉ free_evars ϕ'
Heqcall: propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'}) = eval (update_evar_val x v ρ0) (ex , ϕ')
e: M
Hneq: fresh_evar ϕ' ≠ x
Contra: x ∈ free_evars ϕ'^{evar:0↦fresh_evar ϕ'}
H': x ∈ free_evars ϕ'

False
contradiction.
signature: Signature
M: Model
ρ0: Valuation
x: evar
v: M
ϕ': Pattern
H: (e : M) (ρ : Valuation) (x0 : evar) (v0 : M) (ϕ : Pattern), x0 ∉ free_evars ϕ → {| pr1 := update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0); pr2 := ϕ'^{evar:0↦fresh_evar ϕ'} |} = {| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |} → eval (update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'} = eval (update_evar_val x0 v0 ρ) ϕ → eval (update_evar_val x0 v0 ρ) ϕ = eval ρ ϕ
Hfr: x ∉ free_evars ϕ'
Heqcall: propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'}) = eval (update_evar_val x v ρ0) (ex , ϕ')
e: M
Hneq: fresh_evar ϕ' ≠ x

{| pr1 := update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0); pr2 := ϕ'^{evar:0↦fresh_evar ϕ'} |} = {| pr1 := update_evar_val x v (update_evar_val (fresh_evar ϕ') e ρ0); pr2 := ϕ'^{evar:0↦fresh_evar ϕ'} |}
signature: Signature
M: Model
ρ0: Valuation
x: evar
v: M
ϕ': Pattern
H: (e : M) (ρ : Valuation) (x0 : evar) (v0 : M) (ϕ : Pattern), x0 ∉ free_evars ϕ → {| pr1 := update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0); pr2 := ϕ'^{evar:0↦fresh_evar ϕ'} |} = {| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |} → eval (update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'} = eval (update_evar_val x0 v0 ρ) ϕ → eval (update_evar_val x0 v0 ρ) ϕ = eval ρ ϕ
Hfr: x ∉ free_evars ϕ'
Heqcall: propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'}) = eval (update_evar_val x v ρ0) (ex , ϕ')
e: M
Hneq: fresh_evar ϕ' ≠ x
eval (update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'} = eval (update_evar_val x v (update_evar_val (fresh_evar ϕ') e ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'}
signature: Signature
M: Model
ρ0: Valuation
x: evar
v: M
ϕ': Pattern
H: (e : M) (ρ : Valuation) (x0 : evar) (v0 : M) (ϕ : Pattern), x0 ∉ free_evars ϕ → {| pr1 := update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0); pr2 := ϕ'^{evar:0↦fresh_evar ϕ'} |} = {| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |} → eval (update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'} = eval (update_evar_val x0 v0 ρ) ϕ → eval (update_evar_val x0 v0 ρ) ϕ = eval ρ ϕ
Hfr: x ∉ free_evars ϕ'
Heqcall: propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'}) = eval (update_evar_val x v ρ0) (ex , ϕ')
e: M
Hneq: fresh_evar ϕ' ≠ x

{| pr1 := update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0); pr2 := ϕ'^{evar:0↦fresh_evar ϕ'} |} = {| pr1 := update_evar_val x v (update_evar_val (fresh_evar ϕ') e ρ0); pr2 := ϕ'^{evar:0↦fresh_evar ϕ'} |}
signature: Signature
M: Model
ρ0: Valuation
x: evar
v: M
ϕ': Pattern
H: (e : M) (ρ : Valuation) (x0 : evar) (v0 : M) (ϕ : Pattern), x0 ∉ free_evars ϕ → {| pr1 := update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0); pr2 := ϕ'^{evar:0↦fresh_evar ϕ'} |} = {| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |} → eval (update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'} = eval (update_evar_val x0 v0 ρ) ϕ → eval (update_evar_val x0 v0 ρ) ϕ = eval ρ ϕ
Hfr: x ∉ free_evars ϕ'
Heqcall: propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'}) = eval (update_evar_val x v ρ0) (ex , ϕ')
e: M
Hneq: fresh_evar ϕ' ≠ x

update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0) = update_evar_val x v (update_evar_val (fresh_evar ϕ') e ρ0)
signature: Signature
M: Model
ρ0: Valuation
x: evar
v: M
ϕ': Pattern
H: (e : M) (ρ : Valuation) (x0 : evar) (v0 : M) (ϕ : Pattern), x0 ∉ free_evars ϕ → {| pr1 := update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0); pr2 := ϕ'^{evar:0↦fresh_evar ϕ'} |} = {| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |} → eval (update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'} = eval (update_evar_val x0 v0 ρ) ϕ → eval (update_evar_val x0 v0 ρ) ϕ = eval ρ ϕ
Hfr: x ∉ free_evars ϕ'
Heqcall: propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'}) = eval (update_evar_val x v ρ0) (ex , ϕ')
e: M
Hneq: fresh_evar ϕ' ≠ x

fresh_evar ϕ' ≠ x
apply Hneq.
signature: Signature
M: Model
ρ0: Valuation
x: evar
v: M
ϕ': Pattern
H: (e : M) (ρ : Valuation) (x0 : evar) (v0 : M) (ϕ : Pattern), x0 ∉ free_evars ϕ → {| pr1 := update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0); pr2 := ϕ'^{evar:0↦fresh_evar ϕ'} |} = {| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |} → eval (update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'} = eval (update_evar_val x0 v0 ρ) ϕ → eval (update_evar_val x0 v0 ρ) ϕ = eval ρ ϕ
Hfr: x ∉ free_evars ϕ'
Heqcall: propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'}) = eval (update_evar_val x v ρ0) (ex , ϕ')
e: M
Hneq: fresh_evar ϕ' ≠ x

eval (update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'} = eval (update_evar_val x v (update_evar_val (fresh_evar ϕ') e ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'}
signature: Signature
M: Model
ρ0: Valuation
x: evar
v: M
ϕ': Pattern
H: (e : M) (ρ : Valuation) (x0 : evar) (v0 : M) (ϕ : Pattern), x0 ∉ free_evars ϕ → {| pr1 := update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0); pr2 := ϕ'^{evar:0↦fresh_evar ϕ'} |} = {| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |} → eval (update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'} = eval (update_evar_val x0 v0 ρ) ϕ → eval (update_evar_val x0 v0 ρ) ϕ = eval ρ ϕ
Hfr: x ∉ free_evars ϕ'
Heqcall: propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'}) = eval (update_evar_val x v ρ0) (ex , ϕ')
e: M
Hneq: fresh_evar ϕ' ≠ x

eval (update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'} = eval (update_evar_val x v (update_evar_val (fresh_evar ϕ') e ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'}
signature: Signature
M: Model
ρ0: Valuation
x: evar
v: M
ϕ': Pattern
H: (e : M) (ρ : Valuation) (x0 : evar) (v0 : M) (ϕ : Pattern), x0 ∉ free_evars ϕ → {| pr1 := update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0); pr2 := ϕ'^{evar:0↦fresh_evar ϕ'} |} = {| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |} → eval (update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'} = eval (update_evar_val x0 v0 ρ) ϕ → eval (update_evar_val x0 v0 ρ) ϕ = eval ρ ϕ
Hfr: x ∉ free_evars ϕ'
Heqcall: propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'}) = eval (update_evar_val x v ρ0) (ex , ϕ')
e: M
Hneq: fresh_evar ϕ' ≠ x

update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0) = update_evar_val x v (update_evar_val (fresh_evar ϕ') e ρ0)
signature: Signature
M: Model
ρ0: Valuation
x: evar
v: M
ϕ': Pattern
H: (e : M) (ρ : Valuation) (x0 : evar) (v0 : M) (ϕ : Pattern), x0 ∉ free_evars ϕ → {| pr1 := update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0); pr2 := ϕ'^{evar:0↦fresh_evar ϕ'} |} = {| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |} → eval (update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'} = eval (update_evar_val x0 v0 ρ) ϕ → eval (update_evar_val x0 v0 ρ) ϕ = eval ρ ϕ
Hfr: x ∉ free_evars ϕ'
Heqcall: propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ') e (update_evar_val x v ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'}) = eval (update_evar_val x v ρ0) (ex , ϕ')
e: M
Hneq: fresh_evar ϕ' ≠ x

fresh_evar ϕ' ≠ x
apply Hneq. }
signature: Signature
M: Model
ρ0: Valuation
x: evar
v: M
ϕ': Pattern
H: (S : propset M) (ρ : Valuation) (x0 : evar) (v0 : M) (ϕ : Pattern), x0 ∉ free_evars ϕ → {| pr1 := update_svar_val (fresh_svar ϕ') S (update_evar_val x v ρ0); pr2 := ϕ'^{svar:0↦fresh_svar ϕ'} |} = {| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |} → eval (update_svar_val (fresh_svar ϕ') S (update_evar_val x v ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'} = eval (update_evar_val x0 v0 ρ) ϕ → eval (update_evar_val x0 v0 ρ) ϕ = eval ρ ϕ
Hfr: x ∉ free_evars ϕ'
Heqcall: LeastFixpointOf (λ S : propset M, eval (update_svar_val (fresh_svar ϕ') S (update_evar_val x v ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'}) = eval (update_evar_val x v ρ0) (mu , ϕ')

(let X := fresh_svar ϕ' in LeastFixpointOf (λ S : propset M, let ρ' := update_svar_val X S (update_evar_val x v ρ0) in eval ρ' ϕ'^{svar:0↦X})) = (let X := fresh_svar ϕ' in LeastFixpointOf (λ S : propset M, let ρ' := update_svar_val X S ρ0 in eval ρ' ϕ'^{svar:0↦X}))
signature: Signature
M: Model
ρ0: Valuation
x: evar
v: M
ϕ': Pattern
H: (S : propset M) (ρ : Valuation) (x0 : evar) (v0 : M) (ϕ : Pattern), x0 ∉ free_evars ϕ → {| pr1 := update_svar_val (fresh_svar ϕ') S (update_evar_val x v ρ0); pr2 := ϕ'^{svar:0↦fresh_svar ϕ'} |} = {| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |} → eval (update_svar_val (fresh_svar ϕ') S (update_evar_val x v ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'} = eval (update_evar_val x0 v0 ρ) ϕ → eval (update_evar_val x0 v0 ρ) ϕ = eval ρ ϕ
Hfr: x ∉ free_evars ϕ'
Heqcall: LeastFixpointOf (λ S : propset M, eval (update_svar_val (fresh_svar ϕ') S (update_evar_val x v ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'}) = eval (update_evar_val x v ρ0) (mu , ϕ')

LeastFixpointOf (λ S : propset M, eval (update_svar_val (fresh_svar ϕ') S (update_evar_val x v ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'}) = LeastFixpointOf (λ S : propset M, eval (update_svar_val (fresh_svar ϕ') S ρ0) ϕ'^{svar:0↦fresh_svar ϕ'})
signature: Signature
M: Model
ρ0: Valuation
x: evar
v: M
ϕ': Pattern
H: (S : propset M) (ρ : Valuation) (x0 : evar) (v0 : M) (ϕ : Pattern), x0 ∉ free_evars ϕ → {| pr1 := update_svar_val (fresh_svar ϕ') S (update_evar_val x v ρ0); pr2 := ϕ'^{svar:0↦fresh_svar ϕ'} |} = {| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |} → eval (update_svar_val (fresh_svar ϕ') S (update_evar_val x v ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'} = eval (update_evar_val x0 v0 ρ) ϕ → eval (update_evar_val x0 v0 ρ) ϕ = eval ρ ϕ
Hfr: x ∉ free_evars ϕ'
Heqcall: LeastFixpointOf (λ S : propset M, eval (update_svar_val (fresh_svar ϕ') S (update_evar_val x v ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'}) = eval (update_evar_val x v ρ0) (mu , ϕ')

(λ S : propset M, eval (update_svar_val (fresh_svar ϕ') S (update_evar_val x v ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'}) = (λ S : propset M, eval (update_svar_val (fresh_svar ϕ') S ρ0) ϕ'^{svar:0↦fresh_svar ϕ'})
signature: Signature
M: Model
ρ0: Valuation
x: evar
v: M
ϕ': Pattern
H: (S : propset M) (ρ : Valuation) (x0 : evar) (v0 : M) (ϕ : Pattern), x0 ∉ free_evars ϕ → {| pr1 := update_svar_val (fresh_svar ϕ') S (update_evar_val x v ρ0); pr2 := ϕ'^{svar:0↦fresh_svar ϕ'} |} = {| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |} → eval (update_svar_val (fresh_svar ϕ') S (update_evar_val x v ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'} = eval (update_evar_val x0 v0 ρ) ϕ → eval (update_evar_val x0 v0 ρ) ϕ = eval ρ ϕ
Hfr: x ∉ free_evars ϕ'
Heqcall: LeastFixpointOf (λ S : propset M, eval (update_svar_val (fresh_svar ϕ') S (update_evar_val x v ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'}) = eval (update_evar_val x v ρ0) (mu , ϕ')

x0 : propset M, eval (update_svar_val (fresh_svar ϕ') x0 (update_evar_val x v ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'} = eval (update_svar_val (fresh_svar ϕ') x0 ρ0) ϕ'^{svar:0↦fresh_svar ϕ'}
signature: Signature
M: Model
ρ0: Valuation
x: evar
v: M
ϕ': Pattern
H: (S : propset M) (ρ : Valuation) (x0 : evar) (v0 : M) (ϕ : Pattern), x0 ∉ free_evars ϕ → {| pr1 := update_svar_val (fresh_svar ϕ') S (update_evar_val x v ρ0); pr2 := ϕ'^{svar:0↦fresh_svar ϕ'} |} = {| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |} → eval (update_svar_val (fresh_svar ϕ') S (update_evar_val x v ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'} = eval (update_evar_val x0 v0 ρ) ϕ → eval (update_evar_val x0 v0 ρ) ϕ = eval ρ ϕ
Hfr: x ∉ free_evars ϕ'
Heqcall: LeastFixpointOf (λ S : propset M, eval (update_svar_val (fresh_svar ϕ') S (update_evar_val x v ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'}) = eval (update_evar_val x v ρ0) (mu , ϕ')
e: propset M

eval (update_svar_val (fresh_svar ϕ') e (update_evar_val x v ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'} = eval (update_svar_val (fresh_svar ϕ') e ρ0) ϕ'^{svar:0↦fresh_svar ϕ'}
signature: Signature
M: Model
ρ0: Valuation
x: evar
v: M
ϕ': Pattern
H: (S : propset M) (ρ : Valuation) (x0 : evar) (v0 : M) (ϕ : Pattern), x0 ∉ free_evars ϕ → {| pr1 := update_svar_val (fresh_svar ϕ') S (update_evar_val x v ρ0); pr2 := ϕ'^{svar:0↦fresh_svar ϕ'} |} = {| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |} → eval (update_svar_val (fresh_svar ϕ') S (update_evar_val x v ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'} = eval (update_evar_val x0 v0 ρ) ϕ → eval (update_evar_val x0 v0 ρ) ϕ = eval ρ ϕ
Hfr: x ∉ free_evars ϕ'
Heqcall: LeastFixpointOf (λ S : propset M, eval (update_svar_val (fresh_svar ϕ') S (update_evar_val x v ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'}) = eval (update_evar_val x v ρ0) (mu , ϕ')
e: propset M

eval (update_evar_val x v (update_svar_val (fresh_svar ϕ') e ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'} = eval (update_svar_val (fresh_svar ϕ') e ρ0) ϕ'^{svar:0↦fresh_svar ϕ'}
signature: Signature
M: Model
ρ0: Valuation
x: evar
v: M
ϕ': Pattern
H: (S : propset M) (ρ : Valuation) (x0 : evar) (v0 : M) (ϕ : Pattern), x0 ∉ free_evars ϕ → {| pr1 := update_svar_val (fresh_svar ϕ') S (update_evar_val x v ρ0); pr2 := ϕ'^{svar:0↦fresh_svar ϕ'} |} = {| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |} → eval (update_svar_val (fresh_svar ϕ') S (update_evar_val x v ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'} = eval (update_evar_val x0 v0 ρ) ϕ → eval (update_evar_val x0 v0 ρ) ϕ = eval ρ ϕ
Hfr: x ∉ free_evars ϕ'
Heqcall: LeastFixpointOf (λ S : propset M, eval (update_svar_val (fresh_svar ϕ') S (update_evar_val x v ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'}) = eval (update_evar_val x v ρ0) (mu , ϕ')
e: propset M

eval (update_svar_val (fresh_svar ϕ') e ρ0) ϕ'^{svar:0↦fresh_svar ϕ'} = eval (update_svar_val (fresh_svar ϕ') e ρ0) ϕ'^{svar:0↦fresh_svar ϕ'}
signature: Signature
M: Model
ρ0: Valuation
x: evar
v: M
ϕ': Pattern
H: (S : propset M) (ρ : Valuation) (x0 : evar) (v0 : M) (ϕ : Pattern), x0 ∉ free_evars ϕ → {| pr1 := update_svar_val (fresh_svar ϕ') S (update_evar_val x v ρ0); pr2 := ϕ'^{svar:0↦fresh_svar ϕ'} |} = {| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |} → eval (update_svar_val (fresh_svar ϕ') S (update_evar_val x v ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'} = eval (update_evar_val x0 v0 ρ) ϕ → eval (update_evar_val x0 v0 ρ) ϕ = eval ρ ϕ
Hfr: x ∉ free_evars ϕ'
Heqcall: LeastFixpointOf (λ S : propset M, eval (update_svar_val (fresh_svar ϕ') S (update_evar_val x v ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'}) = eval (update_evar_val x v ρ0) (mu , ϕ')
e: propset M
x ∉ free_evars ϕ'^{svar:0↦fresh_svar ϕ'}
signature: Signature
M: Model
ρ0: Valuation
x: evar
v: M
ϕ': Pattern
H: (S : propset M) (ρ : Valuation) (x0 : evar) (v0 : M) (ϕ : Pattern), x0 ∉ free_evars ϕ → {| pr1 := update_svar_val (fresh_svar ϕ') S (update_evar_val x v ρ0); pr2 := ϕ'^{svar:0↦fresh_svar ϕ'} |} = {| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |} → eval (update_svar_val (fresh_svar ϕ') S (update_evar_val x v ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'} = eval (update_evar_val x0 v0 ρ) ϕ → eval (update_evar_val x0 v0 ρ) ϕ = eval ρ ϕ
Hfr: x ∉ free_evars ϕ'
Heqcall: LeastFixpointOf (λ S : propset M, eval (update_svar_val (fresh_svar ϕ') S (update_evar_val x v ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'}) = eval (update_evar_val x v ρ0) (mu , ϕ')
e: propset M
{| pr1 := update_svar_val (fresh_svar ϕ') ?S (update_evar_val x v ρ0); pr2 := ϕ'^{svar:0↦fresh_svar ϕ'} |} = {| pr1 := update_evar_val x v (update_svar_val (fresh_svar ϕ') e ρ0); pr2 := ϕ'^{svar:0↦fresh_svar ϕ'} |}
signature: Signature
M: Model
ρ0: Valuation
x: evar
v: M
ϕ': Pattern
H: (S : propset M) (ρ : Valuation) (x0 : evar) (v0 : M) (ϕ : Pattern), x0 ∉ free_evars ϕ → {| pr1 := update_svar_val (fresh_svar ϕ') S (update_evar_val x v ρ0); pr2 := ϕ'^{svar:0↦fresh_svar ϕ'} |} = {| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |} → eval (update_svar_val (fresh_svar ϕ') S (update_evar_val x v ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'} = eval (update_evar_val x0 v0 ρ) ϕ → eval (update_evar_val x0 v0 ρ) ϕ = eval ρ ϕ
Hfr: x ∉ free_evars ϕ'
Heqcall: LeastFixpointOf (λ S : propset M, eval (update_svar_val (fresh_svar ϕ') S (update_evar_val x v ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'}) = eval (update_evar_val x v ρ0) (mu , ϕ')
e: propset M
eval (update_svar_val (fresh_svar ϕ') ?S (update_evar_val x v ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'} = eval (update_evar_val x v (update_svar_val (fresh_svar ϕ') e ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'}
signature: Signature
M: Model
ρ0: Valuation
x: evar
v: M
ϕ': Pattern
H: (S : propset M) (ρ : Valuation) (x0 : evar) (v0 : M) (ϕ : Pattern), x0 ∉ free_evars ϕ → {| pr1 := update_svar_val (fresh_svar ϕ') S (update_evar_val x v ρ0); pr2 := ϕ'^{svar:0↦fresh_svar ϕ'} |} = {| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |} → eval (update_svar_val (fresh_svar ϕ') S (update_evar_val x v ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'} = eval (update_evar_val x0 v0 ρ) ϕ → eval (update_evar_val x0 v0 ρ) ϕ = eval ρ ϕ
Hfr: x ∉ free_evars ϕ'
Heqcall: LeastFixpointOf (λ S : propset M, eval (update_svar_val (fresh_svar ϕ') S (update_evar_val x v ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'}) = eval (update_evar_val x v ρ0) (mu , ϕ')
e: propset M

eval (update_svar_val (fresh_svar ϕ') e ρ0) ϕ'^{svar:0↦fresh_svar ϕ'} = eval (update_svar_val (fresh_svar ϕ') e ρ0) ϕ'^{svar:0↦fresh_svar ϕ'}
reflexivity.
signature: Signature
M: Model
ρ0: Valuation
x: evar
v: M
ϕ': Pattern
H: (S : propset M) (ρ : Valuation) (x0 : evar) (v0 : M) (ϕ : Pattern), x0 ∉ free_evars ϕ → {| pr1 := update_svar_val (fresh_svar ϕ') S (update_evar_val x v ρ0); pr2 := ϕ'^{svar:0↦fresh_svar ϕ'} |} = {| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |} → eval (update_svar_val (fresh_svar ϕ') S (update_evar_val x v ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'} = eval (update_evar_val x0 v0 ρ) ϕ → eval (update_evar_val x0 v0 ρ) ϕ = eval ρ ϕ
Hfr: x ∉ free_evars ϕ'
Heqcall: LeastFixpointOf (λ S : propset M, eval (update_svar_val (fresh_svar ϕ') S (update_evar_val x v ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'}) = eval (update_evar_val x v ρ0) (mu , ϕ')
e: propset M

x ∉ free_evars ϕ'^{svar:0↦fresh_svar ϕ'}
signature: Signature
M: Model
ρ0: Valuation
x: evar
v: M
ϕ': Pattern
H: (S : propset M) (ρ : Valuation) (x0 : evar) (v0 : M) (ϕ : Pattern), x0 ∉ free_evars ϕ → {| pr1 := update_svar_val (fresh_svar ϕ') S (update_evar_val x v ρ0); pr2 := ϕ'^{svar:0↦fresh_svar ϕ'} |} = {| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |} → eval (update_svar_val (fresh_svar ϕ') S (update_evar_val x v ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'} = eval (update_evar_val x0 v0 ρ) ϕ → eval (update_evar_val x0 v0 ρ) ϕ = eval ρ ϕ
Hfr: x ∉ free_evars ϕ'
Heqcall: LeastFixpointOf (λ S : propset M, eval (update_svar_val (fresh_svar ϕ') S (update_evar_val x v ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'}) = eval (update_evar_val x v ρ0) (mu , ϕ')
e: propset M
{| pr1 := update_svar_val (fresh_svar ϕ') ?S (update_evar_val x v ρ0); pr2 := ϕ'^{svar:0↦fresh_svar ϕ'} |} = {| pr1 := update_evar_val x v (update_svar_val (fresh_svar ϕ') e ρ0); pr2 := ϕ'^{svar:0↦fresh_svar ϕ'} |}
signature: Signature
M: Model
ρ0: Valuation
x: evar
v: M
ϕ': Pattern
H: (S : propset M) (ρ : Valuation) (x0 : evar) (v0 : M) (ϕ : Pattern), x0 ∉ free_evars ϕ → {| pr1 := update_svar_val (fresh_svar ϕ') S (update_evar_val x v ρ0); pr2 := ϕ'^{svar:0↦fresh_svar ϕ'} |} = {| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |} → eval (update_svar_val (fresh_svar ϕ') S (update_evar_val x v ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'} = eval (update_evar_val x0 v0 ρ) ϕ → eval (update_evar_val x0 v0 ρ) ϕ = eval ρ ϕ
Hfr: x ∉ free_evars ϕ'
Heqcall: LeastFixpointOf (λ S : propset M, eval (update_svar_val (fresh_svar ϕ') S (update_evar_val x v ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'}) = eval (update_evar_val x v ρ0) (mu , ϕ')
e: propset M
eval (update_svar_val (fresh_svar ϕ') ?S (update_evar_val x v ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'} = eval (update_evar_val x v (update_svar_val (fresh_svar ϕ') e ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'}
signature: Signature
M: Model
ρ0: Valuation
x: evar
v: M
ϕ': Pattern
H: (S : propset M) (ρ : Valuation) (x0 : evar) (v0 : M) (ϕ : Pattern), x0 ∉ free_evars ϕ → {| pr1 := update_svar_val (fresh_svar ϕ') S (update_evar_val x v ρ0); pr2 := ϕ'^{svar:0↦fresh_svar ϕ'} |} = {| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |} → eval (update_svar_val (fresh_svar ϕ') S (update_evar_val x v ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'} = eval (update_evar_val x0 v0 ρ) ϕ → eval (update_evar_val x0 v0 ρ) ϕ = eval ρ ϕ
Hfr: x ∉ free_evars ϕ'
Heqcall: LeastFixpointOf (λ S : propset M, eval (update_svar_val (fresh_svar ϕ') S (update_evar_val x v ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'}) = eval (update_evar_val x v ρ0) (mu , ϕ')
e: propset M

x ∉ free_evars ϕ'^{svar:0↦fresh_svar ϕ'}
signature: Signature
M: Model
ρ0: Valuation
x: evar
v: M
ϕ': Pattern
H: (S : propset M) (ρ : Valuation) (x0 : evar) (v0 : M) (ϕ : Pattern), x0 ∉ free_evars ϕ → {| pr1 := update_svar_val (fresh_svar ϕ') S (update_evar_val x v ρ0); pr2 := ϕ'^{svar:0↦fresh_svar ϕ'} |} = {| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |} → eval (update_svar_val (fresh_svar ϕ') S (update_evar_val x v ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'} = eval (update_evar_val x0 v0 ρ) ϕ → eval (update_evar_val x0 v0 ρ) ϕ = eval ρ ϕ
Hfr: x ∉ free_evars ϕ'
Heqcall: LeastFixpointOf (λ S : propset M, eval (update_svar_val (fresh_svar ϕ') S (update_evar_val x v ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'}) = eval (update_evar_val x v ρ0) (mu , ϕ')
e: propset M
Contra: x ∈ free_evars ϕ'^{svar:0↦fresh_svar ϕ'}

False
signature: Signature
M: Model
ρ0: Valuation
x: evar
v: M
ϕ': Pattern
H: (S : propset M) (ρ : Valuation) (x0 : evar) (v0 : M) (ϕ : Pattern), x0 ∉ free_evars ϕ → {| pr1 := update_svar_val (fresh_svar ϕ') S (update_evar_val x v ρ0); pr2 := ϕ'^{svar:0↦fresh_svar ϕ'} |} = {| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |} → eval (update_svar_val (fresh_svar ϕ') S (update_evar_val x v ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'} = eval (update_evar_val x0 v0 ρ) ϕ → eval (update_evar_val x0 v0 ρ) ϕ = eval ρ ϕ
Hfr: x ∉ free_evars ϕ'
Heqcall: LeastFixpointOf (λ S : propset M, eval (update_svar_val (fresh_svar ϕ') S (update_evar_val x v ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'}) = eval (update_evar_val x v ρ0) (mu , ϕ')
e: propset M
Contra: x ∈ free_evars ϕ'

False
contradiction.
signature: Signature
M: Model
ρ0: Valuation
x: evar
v: M
ϕ': Pattern
H: (S : propset M) (ρ : Valuation) (x0 : evar) (v0 : M) (ϕ : Pattern), x0 ∉ free_evars ϕ → {| pr1 := update_svar_val (fresh_svar ϕ') S (update_evar_val x v ρ0); pr2 := ϕ'^{svar:0↦fresh_svar ϕ'} |} = {| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |} → eval (update_svar_val (fresh_svar ϕ') S (update_evar_val x v ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'} = eval (update_evar_val x0 v0 ρ) ϕ → eval (update_evar_val x0 v0 ρ) ϕ = eval ρ ϕ
Hfr: x ∉ free_evars ϕ'
Heqcall: LeastFixpointOf (λ S : propset M, eval (update_svar_val (fresh_svar ϕ') S (update_evar_val x v ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'}) = eval (update_evar_val x v ρ0) (mu , ϕ')
e: propset M

{| pr1 := update_svar_val (fresh_svar ϕ') ?S (update_evar_val x v ρ0); pr2 := ϕ'^{svar:0↦fresh_svar ϕ'} |} = {| pr1 := update_evar_val x v (update_svar_val (fresh_svar ϕ') e ρ0); pr2 := ϕ'^{svar:0↦fresh_svar ϕ'} |}
signature: Signature
M: Model
ρ0: Valuation
x: evar
v: M
ϕ': Pattern
H: (S : propset M) (ρ : Valuation) (x0 : evar) (v0 : M) (ϕ : Pattern), x0 ∉ free_evars ϕ → {| pr1 := update_svar_val (fresh_svar ϕ') S (update_evar_val x v ρ0); pr2 := ϕ'^{svar:0↦fresh_svar ϕ'} |} = {| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |} → eval (update_svar_val (fresh_svar ϕ') S (update_evar_val x v ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'} = eval (update_evar_val x0 v0 ρ) ϕ → eval (update_evar_val x0 v0 ρ) ϕ = eval ρ ϕ
Hfr: x ∉ free_evars ϕ'
Heqcall: LeastFixpointOf (λ S : propset M, eval (update_svar_val (fresh_svar ϕ') S (update_evar_val x v ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'}) = eval (update_evar_val x v ρ0) (mu , ϕ')
e: propset M
eval (update_svar_val (fresh_svar ϕ') ?S (update_evar_val x v ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'} = eval (update_evar_val x v (update_svar_val (fresh_svar ϕ') e ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'}
signature: Signature
M: Model
ρ0: Valuation
x: evar
v: M
ϕ': Pattern
H: (S : propset M) (ρ : Valuation) (x0 : evar) (v0 : M) (ϕ : Pattern), x0 ∉ free_evars ϕ → {| pr1 := update_svar_val (fresh_svar ϕ') S (update_evar_val x v ρ0); pr2 := ϕ'^{svar:0↦fresh_svar ϕ'} |} = {| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |} → eval (update_svar_val (fresh_svar ϕ') S (update_evar_val x v ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'} = eval (update_evar_val x0 v0 ρ) ϕ → eval (update_evar_val x0 v0 ρ) ϕ = eval ρ ϕ
Hfr: x ∉ free_evars ϕ'
Heqcall: LeastFixpointOf (λ S : propset M, eval (update_svar_val (fresh_svar ϕ') S (update_evar_val x v ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'}) = eval (update_evar_val x v ρ0) (mu , ϕ')
e: propset M

{| pr1 := update_svar_val (fresh_svar ϕ') ?S (update_evar_val x v ρ0); pr2 := ϕ'^{svar:0↦fresh_svar ϕ'} |} = {| pr1 := update_evar_val x v (update_svar_val (fresh_svar ϕ') e ρ0); pr2 := ϕ'^{svar:0↦fresh_svar ϕ'} |}
reflexivity.
signature: Signature
M: Model
ρ0: Valuation
x: evar
v: M
ϕ': Pattern
H: (S : propset M) (ρ : Valuation) (x0 : evar) (v0 : M) (ϕ : Pattern), x0 ∉ free_evars ϕ → {| pr1 := update_svar_val (fresh_svar ϕ') S (update_evar_val x v ρ0); pr2 := ϕ'^{svar:0↦fresh_svar ϕ'} |} = {| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |} → eval (update_svar_val (fresh_svar ϕ') S (update_evar_val x v ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'} = eval (update_evar_val x0 v0 ρ) ϕ → eval (update_evar_val x0 v0 ρ) ϕ = eval ρ ϕ
Hfr: x ∉ free_evars ϕ'
Heqcall: LeastFixpointOf (λ S : propset M, eval (update_svar_val (fresh_svar ϕ') S (update_evar_val x v ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'}) = eval (update_evar_val x v ρ0) (mu , ϕ')
e: propset M

eval (update_svar_val (fresh_svar ϕ') e (update_evar_val x v ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'} = eval (update_evar_val x v (update_svar_val (fresh_svar ϕ') e ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'}
signature: Signature
M: Model
ρ0: Valuation
x: evar
v: M
ϕ': Pattern
H: (S : propset M) (ρ : Valuation) (x0 : evar) (v0 : M) (ϕ : Pattern), x0 ∉ free_evars ϕ → {| pr1 := update_svar_val (fresh_svar ϕ') S (update_evar_val x v ρ0); pr2 := ϕ'^{svar:0↦fresh_svar ϕ'} |} = {| pr1 := update_evar_val x0 v0 ρ; pr2 := ϕ |} → eval (update_svar_val (fresh_svar ϕ') S (update_evar_val x v ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'} = eval (update_evar_val x0 v0 ρ) ϕ → eval (update_evar_val x0 v0 ρ) ϕ = eval ρ ϕ
Hfr: x ∉ free_evars ϕ'
Heqcall: LeastFixpointOf (λ S : propset M, eval (update_svar_val (fresh_svar ϕ') S (update_evar_val x v ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'}) = eval (update_evar_val x v ρ0) (mu , ϕ')
e: propset M

eval (update_svar_val (fresh_svar ϕ') e (update_evar_val x v ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'} = eval (update_svar_val (fresh_svar ϕ') e (update_evar_val x v ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'}
reflexivity. Qed.
signature: Signature
M: Model
ρ: Valuation
X: svar
S: propset M
ϕ: Pattern

svar_is_fresh_in X ϕ → eval (update_svar_val X S ρ) ϕ = eval ρ ϕ
signature: Signature
M: Model
ρ: Valuation
X: svar
S: propset M
ϕ: Pattern

svar_is_fresh_in X ϕ → eval (update_svar_val X S ρ) ϕ = eval ρ ϕ
signature: Signature
M: Model
ρ: Valuation
X: svar
S: propset M
ϕ: Pattern
Hfr: svar_is_fresh_in X ϕ

eval (update_svar_val X S ρ) ϕ = eval ρ ϕ
signature: Signature
M: Model
ρ: Valuation
X: svar
S: propset M
ϕ: Pattern
Hfr: X ∉ free_svars ϕ

eval (update_svar_val X S ρ) ϕ = eval ρ ϕ
signature: Signature
M: Model
ρ0: Valuation
X0: svar
S: propset M
X: svar
Hfr: X0 ∉ {[X]}

svar_valuation (update_svar_val X0 S ρ0) X = svar_valuation ρ0 X
signature: Signature
M: Model
ρ0: Valuation
X: svar
S: propset M
ϕ₁, ϕ₂: Pattern
H: X ∉ free_svars ϕ₁ → eval (update_svar_val X S ρ0) ϕ₁ = eval ρ0 ϕ₁
H0: X ∉ free_svars ϕ₂ → eval (update_svar_val X S ρ0) ϕ₂ = eval ρ0 ϕ₂
Hfr: X ∉ free_svars ϕ₁ ∪ free_svars ϕ₂
Heqcall: app_ext (eval (update_svar_val X S ρ0) ϕ₁) (eval (update_svar_val X S ρ0) ϕ₂) = eval (update_svar_val X S ρ0) (ϕ₁ $ ϕ₂)
app_ext (eval (update_svar_val X S ρ0) ϕ₁) (eval (update_svar_val X S ρ0) ϕ₂) = app_ext (eval ρ0 ϕ₁) (eval ρ0 ϕ₂)
signature: Signature
M: Model
ρ0: Valuation
X: svar
S: propset M
ϕ₁, ϕ₂: Pattern
H: X ∉ free_svars ϕ₁ → eval (update_svar_val X S ρ0) ϕ₁ = eval ρ0 ϕ₁
H0: X ∉ free_svars ϕ₂ → eval (update_svar_val X S ρ0) ϕ₂ = eval ρ0 ϕ₂
Hfr: X ∉ free_svars ϕ₁ ∪ free_svars ϕ₂
Heqcall: ⊤ ∖ eval (update_svar_val X S ρ0) ϕ₁ ∪ eval (update_svar_val X S ρ0) ϕ₂ = eval (update_svar_val X S ρ0) (ϕ₁ ---> ϕ₂)
⊤ ∖ eval (update_svar_val X S ρ0) ϕ₁ ∪ eval (update_svar_val X S ρ0) ϕ₂ = ⊤ ∖ eval ρ0 ϕ₁ ∪ eval ρ0 ϕ₂
signature: Signature
M: Model
ρ0: Valuation
X: svar
S: propset M
ϕ': Pattern
H: (e : M) (ρ : Valuation) (X0 : svar) (S0 : propset M) (ϕ : Pattern), X0 ∉ free_svars ϕ → {| pr1 := update_evar_val (fresh_evar ϕ') e (update_svar_val X S ρ0); pr2 := ϕ'^{evar:0↦fresh_evar ϕ'} |} = {| pr1 := update_svar_val X0 S0 ρ; pr2 := ϕ |} → eval (update_evar_val (fresh_evar ϕ') e (update_svar_val X S ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'} = eval (update_svar_val X0 S0 ρ) ϕ → eval (update_svar_val X0 S0 ρ) ϕ = eval ρ ϕ
Hfr: X ∉ free_svars ϕ'
Heqcall: propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ') e (update_svar_val X S ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'}) = eval (update_svar_val X S ρ0) (ex , ϕ')
(let x := fresh_evar ϕ' in propset_fa_union (λ e : M, let ρ' := update_evar_val x e (update_svar_val X S ρ0) in eval ρ' ϕ'^{evar:0↦x})) = (let x := fresh_evar ϕ' in propset_fa_union (λ e : M, let ρ' := update_evar_val x e ρ0 in eval ρ' ϕ'^{evar:0↦x}))
signature: Signature
M: Model
ρ0: Valuation
X: svar
S: propset M
ϕ': Pattern
H: (S0 : propset M) (ρ : Valuation) (X0 : svar) (S1 : propset M) (ϕ : Pattern), X0 ∉ free_svars ϕ → {| pr1 := update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0); pr2 := ϕ'^{svar:0↦fresh_svar ϕ'} |} = {| pr1 := update_svar_val X0 S1 ρ; pr2 := ϕ |} → eval (update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'} = eval (update_svar_val X0 S1 ρ) ϕ → eval (update_svar_val X0 S1 ρ) ϕ = eval ρ ϕ
Hfr: X ∉ free_svars ϕ'
Heqcall: LeastFixpointOf (λ S0 : propset M, eval (update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'}) = eval (update_svar_val X S ρ0) (mu , ϕ')
(let X0 := fresh_svar ϕ' in LeastFixpointOf (λ S0 : propset M, let ρ' := update_svar_val X0 S0 (update_svar_val X S ρ0) in eval ρ' ϕ'^{svar:0↦X0})) = (let X := fresh_svar ϕ' in LeastFixpointOf (λ S : propset M, let ρ' := update_svar_val X S ρ0 in eval ρ' ϕ'^{svar:0↦X}))
signature: Signature
M: Model
ρ0: Valuation
X0: svar
S: propset M
X: svar
Hfr: X0 ∉ {[X]}

svar_valuation (update_svar_val X0 S ρ0) X = svar_valuation ρ0 X
signature: Signature
M: Model
ρ0: Valuation
X0: svar
S: propset M
X: svar
Hfr: X0 ∉ {[X]}

svar_valuation {| evar_valuation := evar_valuation ρ0; svar_valuation := λ sv' : svar, if decide (X0 = sv') then S else svar_valuation ρ0 sv' |} X = svar_valuation ρ0 X
signature: Signature
M: Model
ρ0: Valuation
X0: svar
S: propset M
X: svar
Hfr: X0 ∉ {[X]}

(if decide (X0 = X) then S else svar_valuation ρ0 X) = svar_valuation ρ0 X
signature: Signature
M: Model
ρ0: Valuation
X0: svar
S: propset M
X: svar
Hfr: X0 ∉ {[X]}
e: X0 = X

S = svar_valuation ρ0 X
signature: Signature
M: Model
ρ0: Valuation
X0: svar
S: propset M
X: svar
Hfr: X0 ∉ {[X]}
n: X0 ≠ X
svar_valuation ρ0 X = svar_valuation ρ0 X
signature: Signature
M: Model
ρ0: Valuation
X0: svar
S: propset M
X: svar
Hfr: X0 ∉ {[X]}
e: X0 = X

S = svar_valuation ρ0 X
signature: Signature
M: Model
ρ0: Valuation
S: propset M
X: svar
Hfr: X ∉ {[X]}

S = svar_valuation ρ0 X
signature: Signature
M: Model
ρₑ: evar → M
ρₛ: svar → propset M
S: propset M
X: svar
Hfr: X ∉ {[X]}

S = svar_valuation {| evar_valuation := ρₑ; svar_valuation := ρₛ |} X
signature: Signature
M: Model
ρₑ: evar → M
ρₛ: svar → propset M
S: propset M
X: svar
Hfr: X ∉ {[X]}

S = ρₛ X
signature: Signature
M: Model
ρₑ: evar → M
ρₛ: svar → propset M
S: propset M
X: svar
Hfr: X ≠ X

S = ρₛ X
contradiction.
signature: Signature
M: Model
ρ0: Valuation
X0: svar
S: propset M
X: svar
Hfr: X0 ∉ {[X]}
n: X0 ≠ X

svar_valuation ρ0 X = svar_valuation ρ0 X
reflexivity.
signature: Signature
M: Model
ρ0: Valuation
X: svar
S: propset M
ϕ₁, ϕ₂: Pattern
H: X ∉ free_svars ϕ₁ → eval (update_svar_val X S ρ0) ϕ₁ = eval ρ0 ϕ₁
H0: X ∉ free_svars ϕ₂ → eval (update_svar_val X S ρ0) ϕ₂ = eval ρ0 ϕ₂
Hfr: X ∉ free_svars ϕ₁ ∪ free_svars ϕ₂
Heqcall: app_ext (eval (update_svar_val X S ρ0) ϕ₁) (eval (update_svar_val X S ρ0) ϕ₂) = eval (update_svar_val X S ρ0) (ϕ₁ $ ϕ₂)

app_ext (eval (update_svar_val X S ρ0) ϕ₁) (eval (update_svar_val X S ρ0) ϕ₂) = app_ext (eval ρ0 ϕ₁) (eval ρ0 ϕ₂)
signature: Signature
M: Model
ρ0: Valuation
X: svar
S: propset M
ϕ₁, ϕ₂: Pattern
H: X ∉ free_svars ϕ₁ → eval (update_svar_val X S ρ0) ϕ₁ = eval ρ0 ϕ₁
H0: X ∉ free_svars ϕ₂ → eval (update_svar_val X S ρ0) ϕ₂ = eval ρ0 ϕ₂
Hfr: X ∉ free_svars ϕ₁ ∪ free_svars ϕ₂
Heqcall: ⊤ ∖ eval (update_svar_val X S ρ0) ϕ₁ ∪ eval (update_svar_val X S ρ0) ϕ₂ = eval (update_svar_val X S ρ0) (ϕ₁ ---> ϕ₂)
⊤ ∖ eval (update_svar_val X S ρ0) ϕ₁ ∪ eval (update_svar_val X S ρ0) ϕ₂ = ⊤ ∖ eval ρ0 ϕ₁ ∪ eval ρ0 ϕ₂
signature: Signature
M: Model
ρ0: Valuation
X: svar
S: propset M
ϕ': Pattern
H: (e : M) (ρ : Valuation) (X0 : svar) (S0 : propset M) (ϕ : Pattern), X0 ∉ free_svars ϕ → {| pr1 := update_evar_val (fresh_evar ϕ') e (update_svar_val X S ρ0); pr2 := ϕ'^{evar:0↦fresh_evar ϕ'} |} = {| pr1 := update_svar_val X0 S0 ρ; pr2 := ϕ |} → eval (update_evar_val (fresh_evar ϕ') e (update_svar_val X S ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'} = eval (update_svar_val X0 S0 ρ) ϕ → eval (update_svar_val X0 S0 ρ) ϕ = eval ρ ϕ
Hfr: X ∉ free_svars ϕ'
Heqcall: propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ') e (update_svar_val X S ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'}) = eval (update_svar_val X S ρ0) (ex , ϕ')
(let x := fresh_evar ϕ' in propset_fa_union (λ e : M, let ρ' := update_evar_val x e (update_svar_val X S ρ0) in eval ρ' ϕ'^{evar:0↦x})) = (let x := fresh_evar ϕ' in propset_fa_union (λ e : M, let ρ' := update_evar_val x e ρ0 in eval ρ' ϕ'^{evar:0↦x}))
signature: Signature
M: Model
ρ0: Valuation
X: svar
S: propset M
ϕ': Pattern
H: (S0 : propset M) (ρ : Valuation) (X0 : svar) (S1 : propset M) (ϕ : Pattern), X0 ∉ free_svars ϕ → {| pr1 := update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0); pr2 := ϕ'^{svar:0↦fresh_svar ϕ'} |} = {| pr1 := update_svar_val X0 S1 ρ; pr2 := ϕ |} → eval (update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'} = eval (update_svar_val X0 S1 ρ) ϕ → eval (update_svar_val X0 S1 ρ) ϕ = eval ρ ϕ
Hfr: X ∉ free_svars ϕ'
Heqcall: LeastFixpointOf (λ S0 : propset M, eval (update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'}) = eval (update_svar_val X S ρ0) (mu , ϕ')
(let X0 := fresh_svar ϕ' in LeastFixpointOf (λ S0 : propset M, let ρ' := update_svar_val X0 S0 (update_svar_val X S ρ0) in eval ρ' ϕ'^{svar:0↦X0})) = (let X := fresh_svar ϕ' in LeastFixpointOf (λ S : propset M, let ρ' := update_svar_val X S ρ0 in eval ρ' ϕ'^{svar:0↦X}))
signature: Signature
M: Model
ρ0: Valuation
X: svar
S: propset M
ϕ₁, ϕ₂: Pattern
H: X ∉ free_svars ϕ₁ → eval (update_svar_val X S ρ0) ϕ₁ = eval ρ0 ϕ₁
H0: X ∉ free_svars ϕ₂ → eval (update_svar_val X S ρ0) ϕ₂ = eval ρ0 ϕ₂
Hfr: X ∉ free_svars ϕ₁ ∪ free_svars ϕ₂
Heqcall: app_ext (eval (update_svar_val X S ρ0) ϕ₁) (eval (update_svar_val X S ρ0) ϕ₂) = eval (update_svar_val X S ρ0) (ϕ₁ $ ϕ₂)

app_ext (eval (update_svar_val X S ρ0) ϕ₁) (eval (update_svar_val X S ρ0) ϕ₂) = app_ext (eval ρ0 ϕ₁) (eval ρ0 ϕ₂)
signature: Signature
M: Model
ρ0: Valuation
X: svar
S: propset M
ϕ₁, ϕ₂: Pattern
H: X ∉ free_svars ϕ₁ → eval (update_svar_val X S ρ0) ϕ₁ = eval ρ0 ϕ₁
H0: X ∉ free_svars ϕ₂ → eval (update_svar_val X S ρ0) ϕ₂ = eval ρ0 ϕ₂
Hfr: X ∉ free_svars ϕ₁ ∪ free_svars ϕ₂
Heqcall: app_ext (eval (update_svar_val X S ρ0) ϕ₁) (eval (update_svar_val X S ρ0) ϕ₂) = eval (update_svar_val X S ρ0) (ϕ₁ $ ϕ₂)

X ∉ free_svars ϕ₁
signature: Signature
M: Model
ρ0: Valuation
X: svar
S: propset M
ϕ₁, ϕ₂: Pattern
H: X ∉ free_svars ϕ₁ → eval (update_svar_val X S ρ0) ϕ₁ = eval ρ0 ϕ₁
H0: X ∉ free_svars ϕ₂ → eval (update_svar_val X S ρ0) ϕ₂ = eval ρ0 ϕ₂
Hfr: X ∉ free_svars ϕ₁ ∪ free_svars ϕ₂
Heqcall: app_ext (eval (update_svar_val X S ρ0) ϕ₁) (eval (update_svar_val X S ρ0) ϕ₂) = eval (update_svar_val X S ρ0) (ϕ₁ $ ϕ₂)
app_ext (eval ρ0 ϕ₁) (eval (update_svar_val X S ρ0) ϕ₂) = app_ext (eval ρ0 ϕ₁) (eval ρ0 ϕ₂)
signature: Signature
M: Model
ρ0: Valuation
X: svar
S: propset M
ϕ₁, ϕ₂: Pattern
H: X ∉ free_svars ϕ₁ → eval (update_svar_val X S ρ0) ϕ₁ = eval ρ0 ϕ₁
H0: X ∉ free_svars ϕ₂ → eval (update_svar_val X S ρ0) ϕ₂ = eval ρ0 ϕ₂
Hfr: X ∉ free_svars ϕ₁ ∪ free_svars ϕ₂
Heqcall: app_ext (eval (update_svar_val X S ρ0) ϕ₁) (eval (update_svar_val X S ρ0) ϕ₂) = eval (update_svar_val X S ρ0) (ϕ₁ $ ϕ₂)

X ∉ free_svars ϕ₁
set_solver.
signature: Signature
M: Model
ρ0: Valuation
X: svar
S: propset M
ϕ₁, ϕ₂: Pattern
H: X ∉ free_svars ϕ₁ → eval (update_svar_val X S ρ0) ϕ₁ = eval ρ0 ϕ₁
H0: X ∉ free_svars ϕ₂ → eval (update_svar_val X S ρ0) ϕ₂ = eval ρ0 ϕ₂
Hfr: X ∉ free_svars ϕ₁ ∪ free_svars ϕ₂
Heqcall: app_ext (eval (update_svar_val X S ρ0) ϕ₁) (eval (update_svar_val X S ρ0) ϕ₂) = eval (update_svar_val X S ρ0) (ϕ₁ $ ϕ₂)

app_ext (eval ρ0 ϕ₁) (eval (update_svar_val X S ρ0) ϕ₂) = app_ext (eval ρ0 ϕ₁) (eval ρ0 ϕ₂)
signature: Signature
M: Model
ρ0: Valuation
X: svar
S: propset M
ϕ₁, ϕ₂: Pattern
H: X ∉ free_svars ϕ₁ → eval (update_svar_val X S ρ0) ϕ₁ = eval ρ0 ϕ₁
H0: X ∉ free_svars ϕ₂ → eval (update_svar_val X S ρ0) ϕ₂ = eval ρ0 ϕ₂
Hfr: X ∉ free_svars ϕ₁ ∪ free_svars ϕ₂
Heqcall: app_ext (eval (update_svar_val X S ρ0) ϕ₁) (eval (update_svar_val X S ρ0) ϕ₂) = eval (update_svar_val X S ρ0) (ϕ₁ $ ϕ₂)

X ∉ free_svars ϕ₂
signature: Signature
M: Model
ρ0: Valuation
X: svar
S: propset M
ϕ₁, ϕ₂: Pattern
H: X ∉ free_svars ϕ₁ → eval (update_svar_val X S ρ0) ϕ₁ = eval ρ0 ϕ₁
H0: X ∉ free_svars ϕ₂ → eval (update_svar_val X S ρ0) ϕ₂ = eval ρ0 ϕ₂
Hfr: X ∉ free_svars ϕ₁ ∪ free_svars ϕ₂
Heqcall: app_ext (eval (update_svar_val X S ρ0) ϕ₁) (eval (update_svar_val X S ρ0) ϕ₂) = eval (update_svar_val X S ρ0) (ϕ₁ $ ϕ₂)
app_ext (eval ρ0 ϕ₁) (eval ρ0 ϕ₂) = app_ext (eval ρ0 ϕ₁) (eval ρ0 ϕ₂)
signature: Signature
M: Model
ρ0: Valuation
X: svar
S: propset M
ϕ₁, ϕ₂: Pattern
H: X ∉ free_svars ϕ₁ → eval (update_svar_val X S ρ0) ϕ₁ = eval ρ0 ϕ₁
H0: X ∉ free_svars ϕ₂ → eval (update_svar_val X S ρ0) ϕ₂ = eval ρ0 ϕ₂
Hfr: X ∉ free_svars ϕ₁ ∪ free_svars ϕ₂
Heqcall: app_ext (eval (update_svar_val X S ρ0) ϕ₁) (eval (update_svar_val X S ρ0) ϕ₂) = eval (update_svar_val X S ρ0) (ϕ₁ $ ϕ₂)

X ∉ free_svars ϕ₂
set_solver.
signature: Signature
M: Model
ρ0: Valuation
X: svar
S: propset M
ϕ₁, ϕ₂: Pattern
H: X ∉ free_svars ϕ₁ → eval (update_svar_val X S ρ0) ϕ₁ = eval ρ0 ϕ₁
H0: X ∉ free_svars ϕ₂ → eval (update_svar_val X S ρ0) ϕ₂ = eval ρ0 ϕ₂
Hfr: X ∉ free_svars ϕ₁ ∪ free_svars ϕ₂
Heqcall: app_ext (eval (update_svar_val X S ρ0) ϕ₁) (eval (update_svar_val X S ρ0) ϕ₂) = eval (update_svar_val X S ρ0) (ϕ₁ $ ϕ₂)

app_ext (eval ρ0 ϕ₁) (eval ρ0 ϕ₂) = app_ext (eval ρ0 ϕ₁) (eval ρ0 ϕ₂)
reflexivity.
signature: Signature
M: Model
ρ0: Valuation
X: svar
S: propset M
ϕ₁, ϕ₂: Pattern
H: X ∉ free_svars ϕ₁ → eval (update_svar_val X S ρ0) ϕ₁ = eval ρ0 ϕ₁
H0: X ∉ free_svars ϕ₂ → eval (update_svar_val X S ρ0) ϕ₂ = eval ρ0 ϕ₂
Hfr: X ∉ free_svars ϕ₁ ∪ free_svars ϕ₂
Heqcall: ⊤ ∖ eval (update_svar_val X S ρ0) ϕ₁ ∪ eval (update_svar_val X S ρ0) ϕ₂ = eval (update_svar_val X S ρ0) (ϕ₁ ---> ϕ₂)

⊤ ∖ eval (update_svar_val X S ρ0) ϕ₁ ∪ eval (update_svar_val X S ρ0) ϕ₂ = ⊤ ∖ eval ρ0 ϕ₁ ∪ eval ρ0 ϕ₂
signature: Signature
M: Model
ρ0: Valuation
X: svar
S: propset M
ϕ': Pattern
H: (e : M) (ρ : Valuation) (X0 : svar) (S0 : propset M) (ϕ : Pattern), X0 ∉ free_svars ϕ → {| pr1 := update_evar_val (fresh_evar ϕ') e (update_svar_val X S ρ0); pr2 := ϕ'^{evar:0↦fresh_evar ϕ'} |} = {| pr1 := update_svar_val X0 S0 ρ; pr2 := ϕ |} → eval (update_evar_val (fresh_evar ϕ') e (update_svar_val X S ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'} = eval (update_svar_val X0 S0 ρ) ϕ → eval (update_svar_val X0 S0 ρ) ϕ = eval ρ ϕ
Hfr: X ∉ free_svars ϕ'
Heqcall: propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ') e (update_svar_val X S ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'}) = eval (update_svar_val X S ρ0) (ex , ϕ')
(let x := fresh_evar ϕ' in propset_fa_union (λ e : M, let ρ' := update_evar_val x e (update_svar_val X S ρ0) in eval ρ' ϕ'^{evar:0↦x})) = (let x := fresh_evar ϕ' in propset_fa_union (λ e : M, let ρ' := update_evar_val x e ρ0 in eval ρ' ϕ'^{evar:0↦x}))
signature: Signature
M: Model
ρ0: Valuation
X: svar
S: propset M
ϕ': Pattern
H: (S0 : propset M) (ρ : Valuation) (X0 : svar) (S1 : propset M) (ϕ : Pattern), X0 ∉ free_svars ϕ → {| pr1 := update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0); pr2 := ϕ'^{svar:0↦fresh_svar ϕ'} |} = {| pr1 := update_svar_val X0 S1 ρ; pr2 := ϕ |} → eval (update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'} = eval (update_svar_val X0 S1 ρ) ϕ → eval (update_svar_val X0 S1 ρ) ϕ = eval ρ ϕ
Hfr: X ∉ free_svars ϕ'
Heqcall: LeastFixpointOf (λ S0 : propset M, eval (update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'}) = eval (update_svar_val X S ρ0) (mu , ϕ')
(let X0 := fresh_svar ϕ' in LeastFixpointOf (λ S0 : propset M, let ρ' := update_svar_val X0 S0 (update_svar_val X S ρ0) in eval ρ' ϕ'^{svar:0↦X0})) = (let X := fresh_svar ϕ' in LeastFixpointOf (λ S : propset M, let ρ' := update_svar_val X S ρ0 in eval ρ' ϕ'^{svar:0↦X}))
signature: Signature
M: Model
ρ0: Valuation
X: svar
S: propset M
ϕ₁, ϕ₂: Pattern
H: X ∉ free_svars ϕ₁ → eval (update_svar_val X S ρ0) ϕ₁ = eval ρ0 ϕ₁
H0: X ∉ free_svars ϕ₂ → eval (update_svar_val X S ρ0) ϕ₂ = eval ρ0 ϕ₂
Hfr: X ∉ free_svars ϕ₁ ∪ free_svars ϕ₂
Heqcall: ⊤ ∖ eval (update_svar_val X S ρ0) ϕ₁ ∪ eval (update_svar_val X S ρ0) ϕ₂ = eval (update_svar_val X S ρ0) (ϕ₁ ---> ϕ₂)

⊤ ∖ eval (update_svar_val X S ρ0) ϕ₁ ∪ eval (update_svar_val X S ρ0) ϕ₂ = ⊤ ∖ eval ρ0 ϕ₁ ∪ eval ρ0 ϕ₂
signature: Signature
M: Model
ρ0: Valuation
X: svar
S: propset M
ϕ₁, ϕ₂: Pattern
H: X ∉ free_svars ϕ₁ → eval (update_svar_val X S ρ0) ϕ₁ = eval ρ0 ϕ₁
H0: X ∉ free_svars ϕ₂ → eval (update_svar_val X S ρ0) ϕ₂ = eval ρ0 ϕ₂
Hfr: X ∉ free_svars ϕ₁ ∪ free_svars ϕ₂
Heqcall: ⊤ ∖ eval (update_svar_val X S ρ0) ϕ₁ ∪ eval (update_svar_val X S ρ0) ϕ₂ = eval (update_svar_val X S ρ0) (ϕ₁ ---> ϕ₂)

X ∉ free_svars ϕ₁
signature: Signature
M: Model
ρ0: Valuation
X: svar
S: propset M
ϕ₁, ϕ₂: Pattern
H: X ∉ free_svars ϕ₁ → eval (update_svar_val X S ρ0) ϕ₁ = eval ρ0 ϕ₁
H0: X ∉ free_svars ϕ₂ → eval (update_svar_val X S ρ0) ϕ₂ = eval ρ0 ϕ₂
Hfr: X ∉ free_svars ϕ₁ ∪ free_svars ϕ₂
Heqcall: ⊤ ∖ eval (update_svar_val X S ρ0) ϕ₁ ∪ eval (update_svar_val X S ρ0) ϕ₂ = eval (update_svar_val X S ρ0) (ϕ₁ ---> ϕ₂)
⊤ ∖ eval ρ0 ϕ₁ ∪ eval (update_svar_val X S ρ0) ϕ₂ = ⊤ ∖ eval ρ0 ϕ₁ ∪ eval ρ0 ϕ₂
signature: Signature
M: Model
ρ0: Valuation
X: svar
S: propset M
ϕ₁, ϕ₂: Pattern
H: X ∉ free_svars ϕ₁ → eval (update_svar_val X S ρ0) ϕ₁ = eval ρ0 ϕ₁
H0: X ∉ free_svars ϕ₂ → eval (update_svar_val X S ρ0) ϕ₂ = eval ρ0 ϕ₂
Hfr: X ∉ free_svars ϕ₁ ∪ free_svars ϕ₂
Heqcall: ⊤ ∖ eval (update_svar_val X S ρ0) ϕ₁ ∪ eval (update_svar_val X S ρ0) ϕ₂ = eval (update_svar_val X S ρ0) (ϕ₁ ---> ϕ₂)

X ∉ free_svars ϕ₁
set_solver.
signature: Signature
M: Model
ρ0: Valuation
X: svar
S: propset M
ϕ₁, ϕ₂: Pattern
H: X ∉ free_svars ϕ₁ → eval (update_svar_val X S ρ0) ϕ₁ = eval ρ0 ϕ₁
H0: X ∉ free_svars ϕ₂ → eval (update_svar_val X S ρ0) ϕ₂ = eval ρ0 ϕ₂
Hfr: X ∉ free_svars ϕ₁ ∪ free_svars ϕ₂
Heqcall: ⊤ ∖ eval (update_svar_val X S ρ0) ϕ₁ ∪ eval (update_svar_val X S ρ0) ϕ₂ = eval (update_svar_val X S ρ0) (ϕ₁ ---> ϕ₂)

⊤ ∖ eval ρ0 ϕ₁ ∪ eval (update_svar_val X S ρ0) ϕ₂ = ⊤ ∖ eval ρ0 ϕ₁ ∪ eval ρ0 ϕ₂
signature: Signature
M: Model
ρ0: Valuation
X: svar
S: propset M
ϕ₁, ϕ₂: Pattern
H: X ∉ free_svars ϕ₁ → eval (update_svar_val X S ρ0) ϕ₁ = eval ρ0 ϕ₁
H0: X ∉ free_svars ϕ₂ → eval (update_svar_val X S ρ0) ϕ₂ = eval ρ0 ϕ₂
Hfr: X ∉ free_svars ϕ₁ ∪ free_svars ϕ₂
Heqcall: ⊤ ∖ eval (update_svar_val X S ρ0) ϕ₁ ∪ eval (update_svar_val X S ρ0) ϕ₂ = eval (update_svar_val X S ρ0) (ϕ₁ ---> ϕ₂)

X ∉ free_svars ϕ₂
signature: Signature
M: Model
ρ0: Valuation
X: svar
S: propset M
ϕ₁, ϕ₂: Pattern
H: X ∉ free_svars ϕ₁ → eval (update_svar_val X S ρ0) ϕ₁ = eval ρ0 ϕ₁
H0: X ∉ free_svars ϕ₂ → eval (update_svar_val X S ρ0) ϕ₂ = eval ρ0 ϕ₂
Hfr: X ∉ free_svars ϕ₁ ∪ free_svars ϕ₂
Heqcall: ⊤ ∖ eval (update_svar_val X S ρ0) ϕ₁ ∪ eval (update_svar_val X S ρ0) ϕ₂ = eval (update_svar_val X S ρ0) (ϕ₁ ---> ϕ₂)
⊤ ∖ eval ρ0 ϕ₁ ∪ eval ρ0 ϕ₂ = ⊤ ∖ eval ρ0 ϕ₁ ∪ eval ρ0 ϕ₂
signature: Signature
M: Model
ρ0: Valuation
X: svar
S: propset M
ϕ₁, ϕ₂: Pattern
H: X ∉ free_svars ϕ₁ → eval (update_svar_val X S ρ0) ϕ₁ = eval ρ0 ϕ₁
H0: X ∉ free_svars ϕ₂ → eval (update_svar_val X S ρ0) ϕ₂ = eval ρ0 ϕ₂
Hfr: X ∉ free_svars ϕ₁ ∪ free_svars ϕ₂
Heqcall: ⊤ ∖ eval (update_svar_val X S ρ0) ϕ₁ ∪ eval (update_svar_val X S ρ0) ϕ₂ = eval (update_svar_val X S ρ0) (ϕ₁ ---> ϕ₂)

X ∉ free_svars ϕ₂
set_solver.
signature: Signature
M: Model
ρ0: Valuation
X: svar
S: propset M
ϕ₁, ϕ₂: Pattern
H: X ∉ free_svars ϕ₁ → eval (update_svar_val X S ρ0) ϕ₁ = eval ρ0 ϕ₁
H0: X ∉ free_svars ϕ₂ → eval (update_svar_val X S ρ0) ϕ₂ = eval ρ0 ϕ₂
Hfr: X ∉ free_svars ϕ₁ ∪ free_svars ϕ₂
Heqcall: ⊤ ∖ eval (update_svar_val X S ρ0) ϕ₁ ∪ eval (update_svar_val X S ρ0) ϕ₂ = eval (update_svar_val X S ρ0) (ϕ₁ ---> ϕ₂)

⊤ ∖ eval ρ0 ϕ₁ ∪ eval ρ0 ϕ₂ = ⊤ ∖ eval ρ0 ϕ₁ ∪ eval ρ0 ϕ₂
reflexivity.
signature: Signature
M: Model
ρ0: Valuation
X: svar
S: propset M
ϕ': Pattern
H: (e : M) (ρ : Valuation) (X0 : svar) (S0 : propset M) (ϕ : Pattern), X0 ∉ free_svars ϕ → {| pr1 := update_evar_val (fresh_evar ϕ') e (update_svar_val X S ρ0); pr2 := ϕ'^{evar:0↦fresh_evar ϕ'} |} = {| pr1 := update_svar_val X0 S0 ρ; pr2 := ϕ |} → eval (update_evar_val (fresh_evar ϕ') e (update_svar_val X S ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'} = eval (update_svar_val X0 S0 ρ) ϕ → eval (update_svar_val X0 S0 ρ) ϕ = eval ρ ϕ
Hfr: X ∉ free_svars ϕ'
Heqcall: propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ') e (update_svar_val X S ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'}) = eval (update_svar_val X S ρ0) (ex , ϕ')

(let x := fresh_evar ϕ' in propset_fa_union (λ e : M, let ρ' := update_evar_val x e (update_svar_val X S ρ0) in eval ρ' ϕ'^{evar:0↦x})) = (let x := fresh_evar ϕ' in propset_fa_union (λ e : M, let ρ' := update_evar_val x e ρ0 in eval ρ' ϕ'^{evar:0↦x}))
signature: Signature
M: Model
ρ0: Valuation
X: svar
S: propset M
ϕ': Pattern
H: (S0 : propset M) (ρ : Valuation) (X0 : svar) (S1 : propset M) (ϕ : Pattern), X0 ∉ free_svars ϕ → {| pr1 := update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0); pr2 := ϕ'^{svar:0↦fresh_svar ϕ'} |} = {| pr1 := update_svar_val X0 S1 ρ; pr2 := ϕ |} → eval (update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'} = eval (update_svar_val X0 S1 ρ) ϕ → eval (update_svar_val X0 S1 ρ) ϕ = eval ρ ϕ
Hfr: X ∉ free_svars ϕ'
Heqcall: LeastFixpointOf (λ S0 : propset M, eval (update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'}) = eval (update_svar_val X S ρ0) (mu , ϕ')
(let X0 := fresh_svar ϕ' in LeastFixpointOf (λ S0 : propset M, let ρ' := update_svar_val X0 S0 (update_svar_val X S ρ0) in eval ρ' ϕ'^{svar:0↦X0})) = (let X := fresh_svar ϕ' in LeastFixpointOf (λ S : propset M, let ρ' := update_svar_val X S ρ0 in eval ρ' ϕ'^{svar:0↦X}))
signature: Signature
M: Model
ρ0: Valuation
X: svar
S: propset M
ϕ': Pattern
H: (e : M) (ρ : Valuation) (X0 : svar) (S0 : propset M) (ϕ : Pattern), X0 ∉ free_svars ϕ → {| pr1 := update_evar_val (fresh_evar ϕ') e (update_svar_val X S ρ0); pr2 := ϕ'^{evar:0↦fresh_evar ϕ'} |} = {| pr1 := update_svar_val X0 S0 ρ; pr2 := ϕ |} → eval (update_evar_val (fresh_evar ϕ') e (update_svar_val X S ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'} = eval (update_svar_val X0 S0 ρ) ϕ → eval (update_svar_val X0 S0 ρ) ϕ = eval ρ ϕ
Hfr: X ∉ free_svars ϕ'
Heqcall: propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ') e (update_svar_val X S ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'}) = eval (update_svar_val X S ρ0) (ex , ϕ')

(let x := fresh_evar ϕ' in propset_fa_union (λ e : M, let ρ' := update_evar_val x e (update_svar_val X S ρ0) in eval ρ' ϕ'^{evar:0↦x})) = (let x := fresh_evar ϕ' in propset_fa_union (λ e : M, let ρ' := update_evar_val x e ρ0 in eval ρ' ϕ'^{evar:0↦x}))
signature: Signature
M: Model
ρ0: Valuation
X: svar
S: propset M
ϕ': Pattern
H: (e : M) (ρ : Valuation) (X0 : svar) (S0 : propset M) (ϕ : Pattern), X0 ∉ free_svars ϕ → {| pr1 := update_evar_val (fresh_evar ϕ') e (update_svar_val X S ρ0); pr2 := ϕ'^{evar:0↦fresh_evar ϕ'} |} = {| pr1 := update_svar_val X0 S0 ρ; pr2 := ϕ |} → eval (update_evar_val (fresh_evar ϕ') e (update_svar_val X S ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'} = eval (update_svar_val X0 S0 ρ) ϕ → eval (update_svar_val X0 S0 ρ) ϕ = eval ρ ϕ
Hfr: X ∉ free_svars ϕ'
Heqcall: propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ') e (update_svar_val X S ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'}) = eval (update_svar_val X S ρ0) (ex , ϕ')

propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ') e (update_svar_val X S ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'}) = propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ') e ρ0) ϕ'^{evar:0↦fresh_evar ϕ'})
signature: Signature
M: Model
ρ0: Valuation
X: svar
S: propset M
ϕ': Pattern
H: (e : M) (ρ : Valuation) (X0 : svar) (S0 : propset M) (ϕ : Pattern), X0 ∉ free_svars ϕ → {| pr1 := update_evar_val (fresh_evar ϕ') e (update_svar_val X S ρ0); pr2 := ϕ'^{evar:0↦fresh_evar ϕ'} |} = {| pr1 := update_svar_val X0 S0 ρ; pr2 := ϕ |} → eval (update_evar_val (fresh_evar ϕ') e (update_svar_val X S ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'} = eval (update_svar_val X0 S0 ρ) ϕ → eval (update_svar_val X0 S0 ρ) ϕ = eval ρ ϕ
Hfr: X ∉ free_svars ϕ'
Heqcall: propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ') e (update_svar_val X S ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'}) = eval (update_svar_val X S ρ0) (ex , ϕ')

(λ e : M, eval (update_evar_val (fresh_evar ϕ') e (update_svar_val X S ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'}) = (λ e : M, eval (update_evar_val (fresh_evar ϕ') e ρ0) ϕ'^{evar:0↦fresh_evar ϕ'})
signature: Signature
M: Model
ρ0: Valuation
X: svar
S: propset M
ϕ': Pattern
H: (e : M) (ρ : Valuation) (X0 : svar) (S0 : propset M) (ϕ : Pattern), X0 ∉ free_svars ϕ → {| pr1 := update_evar_val (fresh_evar ϕ') e (update_svar_val X S ρ0); pr2 := ϕ'^{evar:0↦fresh_evar ϕ'} |} = {| pr1 := update_svar_val X0 S0 ρ; pr2 := ϕ |} → eval (update_evar_val (fresh_evar ϕ') e (update_svar_val X S ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'} = eval (update_svar_val X0 S0 ρ) ϕ → eval (update_svar_val X0 S0 ρ) ϕ = eval ρ ϕ
Hfr: X ∉ free_svars ϕ'
Heqcall: propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ') e (update_svar_val X S ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'}) = eval (update_svar_val X S ρ0) (ex , ϕ')

x : M, eval (update_evar_val (fresh_evar ϕ') x (update_svar_val X S ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'} = eval (update_evar_val (fresh_evar ϕ') x ρ0) ϕ'^{evar:0↦fresh_evar ϕ'}
signature: Signature
M: Model
ρ0: Valuation
X: svar
S: propset M
ϕ': Pattern
H: (e : M) (ρ : Valuation) (X0 : svar) (S0 : propset M) (ϕ : Pattern), X0 ∉ free_svars ϕ → {| pr1 := update_evar_val (fresh_evar ϕ') e (update_svar_val X S ρ0); pr2 := ϕ'^{evar:0↦fresh_evar ϕ'} |} = {| pr1 := update_svar_val X0 S0 ρ; pr2 := ϕ |} → eval (update_evar_val (fresh_evar ϕ') e (update_svar_val X S ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'} = eval (update_svar_val X0 S0 ρ) ϕ → eval (update_svar_val X0 S0 ρ) ϕ = eval ρ ϕ
Hfr: X ∉ free_svars ϕ'
Heqcall: propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ') e (update_svar_val X S ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'}) = eval (update_svar_val X S ρ0) (ex , ϕ')
e: M

eval (update_evar_val (fresh_evar ϕ') e (update_svar_val X S ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'} = eval (update_evar_val (fresh_evar ϕ') e ρ0) ϕ'^{evar:0↦fresh_evar ϕ'}
signature: Signature
M: Model
ρ0: Valuation
X: svar
S: propset M
ϕ': Pattern
H: (e : M) (ρ : Valuation) (X0 : svar) (S0 : propset M) (ϕ : Pattern), X0 ∉ free_svars ϕ → {| pr1 := update_evar_val (fresh_evar ϕ') e (update_svar_val X S ρ0); pr2 := ϕ'^{evar:0↦fresh_evar ϕ'} |} = {| pr1 := update_svar_val X0 S0 ρ; pr2 := ϕ |} → eval (update_evar_val (fresh_evar ϕ') e (update_svar_val X S ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'} = eval (update_svar_val X0 S0 ρ) ϕ → eval (update_svar_val X0 S0 ρ) ϕ = eval ρ ϕ
Hfr: X ∉ free_svars ϕ'
Heqcall: propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ') e (update_svar_val X S ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'}) = eval (update_svar_val X S ρ0) (ex , ϕ')
e: M

eval (update_svar_val X S (update_evar_val (fresh_evar ϕ') e ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'} = eval (update_evar_val (fresh_evar ϕ') e ρ0) ϕ'^{evar:0↦fresh_evar ϕ'}
signature: Signature
M: Model
ρ0: Valuation
X: svar
S: propset M
ϕ': Pattern
H: (e : M) (ρ : Valuation) (X0 : svar) (S0 : propset M) (ϕ : Pattern), X0 ∉ free_svars ϕ → {| pr1 := update_evar_val (fresh_evar ϕ') e (update_svar_val X S ρ0); pr2 := ϕ'^{evar:0↦fresh_evar ϕ'} |} = {| pr1 := update_svar_val X0 S0 ρ; pr2 := ϕ |} → eval (update_evar_val (fresh_evar ϕ') e (update_svar_val X S ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'} = eval (update_svar_val X0 S0 ρ) ϕ → eval (update_svar_val X0 S0 ρ) ϕ = eval ρ ϕ
Hfr: X ∉ free_svars ϕ'
Heqcall: propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ') e (update_svar_val X S ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'}) = eval (update_svar_val X S ρ0) (ex , ϕ')
e: M

eval (update_evar_val (fresh_evar ϕ') e ρ0) ϕ'^{evar:0↦fresh_evar ϕ'} = eval (update_evar_val (fresh_evar ϕ') e ρ0) ϕ'^{evar:0↦fresh_evar ϕ'}
signature: Signature
M: Model
ρ0: Valuation
X: svar
S: propset M
ϕ': Pattern
H: (e : M) (ρ : Valuation) (X0 : svar) (S0 : propset M) (ϕ : Pattern), X0 ∉ free_svars ϕ → {| pr1 := update_evar_val (fresh_evar ϕ') e (update_svar_val X S ρ0); pr2 := ϕ'^{evar:0↦fresh_evar ϕ'} |} = {| pr1 := update_svar_val X0 S0 ρ; pr2 := ϕ |} → eval (update_evar_val (fresh_evar ϕ') e (update_svar_val X S ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'} = eval (update_svar_val X0 S0 ρ) ϕ → eval (update_svar_val X0 S0 ρ) ϕ = eval ρ ϕ
Hfr: X ∉ free_svars ϕ'
Heqcall: propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ') e (update_svar_val X S ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'}) = eval (update_svar_val X S ρ0) (ex , ϕ')
e: M
X ∉ free_svars ϕ'^{evar:0↦fresh_evar ϕ'}
signature: Signature
M: Model
ρ0: Valuation
X: svar
S: propset M
ϕ': Pattern
H: (e : M) (ρ : Valuation) (X0 : svar) (S0 : propset M) (ϕ : Pattern), X0 ∉ free_svars ϕ → {| pr1 := update_evar_val (fresh_evar ϕ') e (update_svar_val X S ρ0); pr2 := ϕ'^{evar:0↦fresh_evar ϕ'} |} = {| pr1 := update_svar_val X0 S0 ρ; pr2 := ϕ |} → eval (update_evar_val (fresh_evar ϕ') e (update_svar_val X S ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'} = eval (update_svar_val X0 S0 ρ) ϕ → eval (update_svar_val X0 S0 ρ) ϕ = eval ρ ϕ
Hfr: X ∉ free_svars ϕ'
Heqcall: propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ') e (update_svar_val X S ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'}) = eval (update_svar_val X S ρ0) (ex , ϕ')
e: M
{| pr1 := update_evar_val (fresh_evar ϕ') e (update_svar_val X S ρ0); pr2 := ϕ'^{evar:0↦fresh_evar ϕ'} |} = {| pr1 := update_svar_val X S (update_evar_val (fresh_evar ϕ') e ρ0); pr2 := ϕ'^{evar:0↦fresh_evar ϕ'} |}
signature: Signature
M: Model
ρ0: Valuation
X: svar
S: propset M
ϕ': Pattern
H: (e : M) (ρ : Valuation) (X0 : svar) (S0 : propset M) (ϕ : Pattern), X0 ∉ free_svars ϕ → {| pr1 := update_evar_val (fresh_evar ϕ') e (update_svar_val X S ρ0); pr2 := ϕ'^{evar:0↦fresh_evar ϕ'} |} = {| pr1 := update_svar_val X0 S0 ρ; pr2 := ϕ |} → eval (update_evar_val (fresh_evar ϕ') e (update_svar_val X S ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'} = eval (update_svar_val X0 S0 ρ) ϕ → eval (update_svar_val X0 S0 ρ) ϕ = eval ρ ϕ
Hfr: X ∉ free_svars ϕ'
Heqcall: propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ') e (update_svar_val X S ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'}) = eval (update_svar_val X S ρ0) (ex , ϕ')
e: M
eval (update_evar_val (fresh_evar ϕ') e (update_svar_val X S ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'} = eval (update_svar_val X S (update_evar_val (fresh_evar ϕ') e ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'}
signature: Signature
M: Model
ρ0: Valuation
X: svar
S: propset M
ϕ': Pattern
H: (e : M) (ρ : Valuation) (X0 : svar) (S0 : propset M) (ϕ : Pattern), X0 ∉ free_svars ϕ → {| pr1 := update_evar_val (fresh_evar ϕ') e (update_svar_val X S ρ0); pr2 := ϕ'^{evar:0↦fresh_evar ϕ'} |} = {| pr1 := update_svar_val X0 S0 ρ; pr2 := ϕ |} → eval (update_evar_val (fresh_evar ϕ') e (update_svar_val X S ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'} = eval (update_svar_val X0 S0 ρ) ϕ → eval (update_svar_val X0 S0 ρ) ϕ = eval ρ ϕ
Hfr: X ∉ free_svars ϕ'
Heqcall: propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ') e (update_svar_val X S ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'}) = eval (update_svar_val X S ρ0) (ex , ϕ')
e: M

eval (update_evar_val (fresh_evar ϕ') e ρ0) ϕ'^{evar:0↦fresh_evar ϕ'} = eval (update_evar_val (fresh_evar ϕ') e ρ0) ϕ'^{evar:0↦fresh_evar ϕ'}
reflexivity.
signature: Signature
M: Model
ρ0: Valuation
X: svar
S: propset M
ϕ': Pattern
H: (e : M) (ρ : Valuation) (X0 : svar) (S0 : propset M) (ϕ : Pattern), X0 ∉ free_svars ϕ → {| pr1 := update_evar_val (fresh_evar ϕ') e (update_svar_val X S ρ0); pr2 := ϕ'^{evar:0↦fresh_evar ϕ'} |} = {| pr1 := update_svar_val X0 S0 ρ; pr2 := ϕ |} → eval (update_evar_val (fresh_evar ϕ') e (update_svar_val X S ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'} = eval (update_svar_val X0 S0 ρ) ϕ → eval (update_svar_val X0 S0 ρ) ϕ = eval ρ ϕ
Hfr: X ∉ free_svars ϕ'
Heqcall: propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ') e (update_svar_val X S ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'}) = eval (update_svar_val X S ρ0) (ex , ϕ')
e: M

X ∉ free_svars ϕ'^{evar:0↦fresh_evar ϕ'}
signature: Signature
M: Model
ρ0: Valuation
X: svar
S: propset M
ϕ': Pattern
H: (e : M) (ρ : Valuation) (X0 : svar) (S0 : propset M) (ϕ : Pattern), X0 ∉ free_svars ϕ → {| pr1 := update_evar_val (fresh_evar ϕ') e (update_svar_val X S ρ0); pr2 := ϕ'^{evar:0↦fresh_evar ϕ'} |} = {| pr1 := update_svar_val X0 S0 ρ; pr2 := ϕ |} → eval (update_evar_val (fresh_evar ϕ') e (update_svar_val X S ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'} = eval (update_svar_val X0 S0 ρ) ϕ → eval (update_svar_val X0 S0 ρ) ϕ = eval ρ ϕ
Hfr: X ∉ free_svars ϕ'
Heqcall: propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ') e (update_svar_val X S ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'}) = eval (update_svar_val X S ρ0) (ex , ϕ')
e: M
{| pr1 := update_evar_val (fresh_evar ϕ') e (update_svar_val X S ρ0); pr2 := ϕ'^{evar:0↦fresh_evar ϕ'} |} = {| pr1 := update_svar_val X S (update_evar_val (fresh_evar ϕ') e ρ0); pr2 := ϕ'^{evar:0↦fresh_evar ϕ'} |}
signature: Signature
M: Model
ρ0: Valuation
X: svar
S: propset M
ϕ': Pattern
H: (e : M) (ρ : Valuation) (X0 : svar) (S0 : propset M) (ϕ : Pattern), X0 ∉ free_svars ϕ → {| pr1 := update_evar_val (fresh_evar ϕ') e (update_svar_val X S ρ0); pr2 := ϕ'^{evar:0↦fresh_evar ϕ'} |} = {| pr1 := update_svar_val X0 S0 ρ; pr2 := ϕ |} → eval (update_evar_val (fresh_evar ϕ') e (update_svar_val X S ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'} = eval (update_svar_val X0 S0 ρ) ϕ → eval (update_svar_val X0 S0 ρ) ϕ = eval ρ ϕ
Hfr: X ∉ free_svars ϕ'
Heqcall: propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ') e (update_svar_val X S ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'}) = eval (update_svar_val X S ρ0) (ex , ϕ')
e: M
eval (update_evar_val (fresh_evar ϕ') e (update_svar_val X S ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'} = eval (update_svar_val X S (update_evar_val (fresh_evar ϕ') e ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'}
signature: Signature
M: Model
ρ0: Valuation
X: svar
S: propset M
ϕ': Pattern
H: (e : M) (ρ : Valuation) (X0 : svar) (S0 : propset M) (ϕ : Pattern), X0 ∉ free_svars ϕ → {| pr1 := update_evar_val (fresh_evar ϕ') e (update_svar_val X S ρ0); pr2 := ϕ'^{evar:0↦fresh_evar ϕ'} |} = {| pr1 := update_svar_val X0 S0 ρ; pr2 := ϕ |} → eval (update_evar_val (fresh_evar ϕ') e (update_svar_val X S ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'} = eval (update_svar_val X0 S0 ρ) ϕ → eval (update_svar_val X0 S0 ρ) ϕ = eval ρ ϕ
Hfr: X ∉ free_svars ϕ'
Heqcall: propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ') e (update_svar_val X S ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'}) = eval (update_svar_val X S ρ0) (ex , ϕ')
e: M

X ∉ free_svars ϕ'^{evar:0↦fresh_evar ϕ'}
signature: Signature
M: Model
ρ0: Valuation
X: svar
S: propset M
ϕ': Pattern
H: (e : M) (ρ : Valuation) (X0 : svar) (S0 : propset M) (ϕ : Pattern), X0 ∉ free_svars ϕ → {| pr1 := update_evar_val (fresh_evar ϕ') e (update_svar_val X S ρ0); pr2 := ϕ'^{evar:0↦fresh_evar ϕ'} |} = {| pr1 := update_svar_val X0 S0 ρ; pr2 := ϕ |} → eval (update_evar_val (fresh_evar ϕ') e (update_svar_val X S ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'} = eval (update_svar_val X0 S0 ρ) ϕ → eval (update_svar_val X0 S0 ρ) ϕ = eval ρ ϕ
Hfr: X ∉ free_svars ϕ'
Heqcall: propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ') e (update_svar_val X S ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'}) = eval (update_svar_val X S ρ0) (ex , ϕ')
e: M

svar_is_fresh_in X ϕ'
apply Hfr.
signature: Signature
M: Model
ρ0: Valuation
X: svar
S: propset M
ϕ': Pattern
H: (e : M) (ρ : Valuation) (X0 : svar) (S0 : propset M) (ϕ : Pattern), X0 ∉ free_svars ϕ → {| pr1 := update_evar_val (fresh_evar ϕ') e (update_svar_val X S ρ0); pr2 := ϕ'^{evar:0↦fresh_evar ϕ'} |} = {| pr1 := update_svar_val X0 S0 ρ; pr2 := ϕ |} → eval (update_evar_val (fresh_evar ϕ') e (update_svar_val X S ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'} = eval (update_svar_val X0 S0 ρ) ϕ → eval (update_svar_val X0 S0 ρ) ϕ = eval ρ ϕ
Hfr: X ∉ free_svars ϕ'
Heqcall: propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ') e (update_svar_val X S ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'}) = eval (update_svar_val X S ρ0) (ex , ϕ')
e: M

{| pr1 := update_evar_val (fresh_evar ϕ') e (update_svar_val X S ρ0); pr2 := ϕ'^{evar:0↦fresh_evar ϕ'} |} = {| pr1 := update_svar_val X S (update_evar_val (fresh_evar ϕ') e ρ0); pr2 := ϕ'^{evar:0↦fresh_evar ϕ'} |}
signature: Signature
M: Model
ρ0: Valuation
X: svar
S: propset M
ϕ': Pattern
H: (e : M) (ρ : Valuation) (X0 : svar) (S0 : propset M) (ϕ : Pattern), X0 ∉ free_svars ϕ → {| pr1 := update_evar_val (fresh_evar ϕ') e (update_svar_val X S ρ0); pr2 := ϕ'^{evar:0↦fresh_evar ϕ'} |} = {| pr1 := update_svar_val X0 S0 ρ; pr2 := ϕ |} → eval (update_evar_val (fresh_evar ϕ') e (update_svar_val X S ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'} = eval (update_svar_val X0 S0 ρ) ϕ → eval (update_svar_val X0 S0 ρ) ϕ = eval ρ ϕ
Hfr: X ∉ free_svars ϕ'
Heqcall: propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ') e (update_svar_val X S ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'}) = eval (update_svar_val X S ρ0) (ex , ϕ')
e: M
eval (update_evar_val (fresh_evar ϕ') e (update_svar_val X S ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'} = eval (update_svar_val X S (update_evar_val (fresh_evar ϕ') e ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'}
signature: Signature
M: Model
ρ0: Valuation
X: svar
S: propset M
ϕ': Pattern
H: (e : M) (ρ : Valuation) (X0 : svar) (S0 : propset M) (ϕ : Pattern), X0 ∉ free_svars ϕ → {| pr1 := update_evar_val (fresh_evar ϕ') e (update_svar_val X S ρ0); pr2 := ϕ'^{evar:0↦fresh_evar ϕ'} |} = {| pr1 := update_svar_val X0 S0 ρ; pr2 := ϕ |} → eval (update_evar_val (fresh_evar ϕ') e (update_svar_val X S ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'} = eval (update_svar_val X0 S0 ρ) ϕ → eval (update_svar_val X0 S0 ρ) ϕ = eval ρ ϕ
Hfr: X ∉ free_svars ϕ'
Heqcall: propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ') e (update_svar_val X S ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'}) = eval (update_svar_val X S ρ0) (ex , ϕ')
e: M

{| pr1 := update_evar_val (fresh_evar ϕ') e (update_svar_val X S ρ0); pr2 := ϕ'^{evar:0↦fresh_evar ϕ'} |} = {| pr1 := update_svar_val X S (update_evar_val (fresh_evar ϕ') e ρ0); pr2 := ϕ'^{evar:0↦fresh_evar ϕ'} |}
reflexivity.
signature: Signature
M: Model
ρ0: Valuation
X: svar
S: propset M
ϕ': Pattern
H: (e : M) (ρ : Valuation) (X0 : svar) (S0 : propset M) (ϕ : Pattern), X0 ∉ free_svars ϕ → {| pr1 := update_evar_val (fresh_evar ϕ') e (update_svar_val X S ρ0); pr2 := ϕ'^{evar:0↦fresh_evar ϕ'} |} = {| pr1 := update_svar_val X0 S0 ρ; pr2 := ϕ |} → eval (update_evar_val (fresh_evar ϕ') e (update_svar_val X S ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'} = eval (update_svar_val X0 S0 ρ) ϕ → eval (update_svar_val X0 S0 ρ) ϕ = eval ρ ϕ
Hfr: X ∉ free_svars ϕ'
Heqcall: propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ') e (update_svar_val X S ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'}) = eval (update_svar_val X S ρ0) (ex , ϕ')
e: M

eval (update_evar_val (fresh_evar ϕ') e (update_svar_val X S ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'} = eval (update_svar_val X S (update_evar_val (fresh_evar ϕ') e ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'}
signature: Signature
M: Model
ρ0: Valuation
X: svar
S: propset M
ϕ': Pattern
H: (e : M) (ρ : Valuation) (X0 : svar) (S0 : propset M) (ϕ : Pattern), X0 ∉ free_svars ϕ → {| pr1 := update_evar_val (fresh_evar ϕ') e (update_svar_val X S ρ0); pr2 := ϕ'^{evar:0↦fresh_evar ϕ'} |} = {| pr1 := update_svar_val X0 S0 ρ; pr2 := ϕ |} → eval (update_evar_val (fresh_evar ϕ') e (update_svar_val X S ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'} = eval (update_svar_val X0 S0 ρ) ϕ → eval (update_svar_val X0 S0 ρ) ϕ = eval ρ ϕ
Hfr: X ∉ free_svars ϕ'
Heqcall: propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ') e (update_svar_val X S ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'}) = eval (update_svar_val X S ρ0) (ex , ϕ')
e: M

eval (update_evar_val (fresh_evar ϕ') e (update_svar_val X S ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'} = eval (update_svar_val X S (update_evar_val (fresh_evar ϕ') e ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'}
signature: Signature
M: Model
ρ0: Valuation
X: svar
S: propset M
ϕ': Pattern
H: (e : M) (ρ : Valuation) (X0 : svar) (S0 : propset M) (ϕ : Pattern), X0 ∉ free_svars ϕ → {| pr1 := update_evar_val (fresh_evar ϕ') e (update_svar_val X S ρ0); pr2 := ϕ'^{evar:0↦fresh_evar ϕ'} |} = {| pr1 := update_svar_val X0 S0 ρ; pr2 := ϕ |} → eval (update_evar_val (fresh_evar ϕ') e (update_svar_val X S ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'} = eval (update_svar_val X0 S0 ρ) ϕ → eval (update_svar_val X0 S0 ρ) ϕ = eval ρ ϕ
Hfr: X ∉ free_svars ϕ'
Heqcall: propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ') e (update_svar_val X S ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'}) = eval (update_svar_val X S ρ0) (ex , ϕ')
e: M

eval (update_svar_val X S (update_evar_val (fresh_evar ϕ') e ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'} = eval (update_svar_val X S (update_evar_val (fresh_evar ϕ') e ρ0)) ϕ'^{evar:0↦fresh_evar ϕ'}
reflexivity. }
signature: Signature
M: Model
ρ0: Valuation
X: svar
S: propset M
ϕ': Pattern
H: (S0 : propset M) (ρ : Valuation) (X0 : svar) (S1 : propset M) (ϕ : Pattern), X0 ∉ free_svars ϕ → {| pr1 := update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0); pr2 := ϕ'^{svar:0↦fresh_svar ϕ'} |} = {| pr1 := update_svar_val X0 S1 ρ; pr2 := ϕ |} → eval (update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'} = eval (update_svar_val X0 S1 ρ) ϕ → eval (update_svar_val X0 S1 ρ) ϕ = eval ρ ϕ
Hfr: X ∉ free_svars ϕ'
Heqcall: LeastFixpointOf (λ S0 : propset M, eval (update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'}) = eval (update_svar_val X S ρ0) (mu , ϕ')

(let X0 := fresh_svar ϕ' in LeastFixpointOf (λ S0 : propset M, let ρ' := update_svar_val X0 S0 (update_svar_val X S ρ0) in eval ρ' ϕ'^{svar:0↦X0})) = (let X := fresh_svar ϕ' in LeastFixpointOf (λ S : propset M, let ρ' := update_svar_val X S ρ0 in eval ρ' ϕ'^{svar:0↦X}))
signature: Signature
M: Model
ρ0: Valuation
X: svar
S: propset M
ϕ': Pattern
H: (S0 : propset M) (ρ : Valuation) (X0 : svar) (S1 : propset M) (ϕ : Pattern), X0 ∉ free_svars ϕ → {| pr1 := update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0); pr2 := ϕ'^{svar:0↦fresh_svar ϕ'} |} = {| pr1 := update_svar_val X0 S1 ρ; pr2 := ϕ |} → eval (update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'} = eval (update_svar_val X0 S1 ρ) ϕ → eval (update_svar_val X0 S1 ρ) ϕ = eval ρ ϕ
Hfr: X ∉ free_svars ϕ'
Heqcall: LeastFixpointOf (λ S0 : propset M, eval (update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'}) = eval (update_svar_val X S ρ0) (mu , ϕ')

(let X0 := fresh_svar ϕ' in LeastFixpointOf (λ S0 : propset M, let ρ' := update_svar_val X0 S0 (update_svar_val X S ρ0) in eval ρ' ϕ'^{svar:0↦X0})) = (let X := fresh_svar ϕ' in LeastFixpointOf (λ S : propset M, let ρ' := update_svar_val X S ρ0 in eval ρ' ϕ'^{svar:0↦X}))
signature: Signature
M: Model
ρ0: Valuation
X: svar
S: propset M
ϕ': Pattern
H: (S0 : propset M) (ρ : Valuation) (X0 : svar) (S1 : propset M) (ϕ : Pattern), X0 ∉ free_svars ϕ → {| pr1 := update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0); pr2 := ϕ'^{svar:0↦fresh_svar ϕ'} |} = {| pr1 := update_svar_val X0 S1 ρ; pr2 := ϕ |} → eval (update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'} = eval (update_svar_val X0 S1 ρ) ϕ → eval (update_svar_val X0 S1 ρ) ϕ = eval ρ ϕ
Hfr: X ∉ free_svars ϕ'
Heqcall: LeastFixpointOf (λ S0 : propset M, eval (update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'}) = eval (update_svar_val X S ρ0) (mu , ϕ')

(λ S0 : propset M, let ρ' := update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0) in eval ρ' ϕ'^{svar:0↦fresh_svar ϕ'}) = (λ S : propset M, let ρ' := update_svar_val (fresh_svar ϕ') S ρ0 in eval ρ' ϕ'^{svar:0↦fresh_svar ϕ'})
signature: Signature
M: Model
ρ0: Valuation
X: svar
S: propset M
ϕ': Pattern
H: (S0 : propset M) (ρ : Valuation) (X0 : svar) (S1 : propset M) (ϕ : Pattern), X0 ∉ free_svars ϕ → {| pr1 := update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0); pr2 := ϕ'^{svar:0↦fresh_svar ϕ'} |} = {| pr1 := update_svar_val X0 S1 ρ; pr2 := ϕ |} → eval (update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'} = eval (update_svar_val X0 S1 ρ) ϕ → eval (update_svar_val X0 S1 ρ) ϕ = eval ρ ϕ
Hfr: X ∉ free_svars ϕ'
Heqcall: LeastFixpointOf (λ S0 : propset M, eval (update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'}) = eval (update_svar_val X S ρ0) (mu , ϕ')

x : propset M, (let ρ' := update_svar_val (fresh_svar ϕ') x (update_svar_val X S ρ0) in eval ρ' ϕ'^{svar:0↦fresh_svar ϕ'}) = (let ρ' := update_svar_val (fresh_svar ϕ') x ρ0 in eval ρ' ϕ'^{svar:0↦fresh_svar ϕ'})
signature: Signature
M: Model
ρ0: Valuation
X: svar
S: propset M
ϕ': Pattern
H: (S0 : propset M) (ρ : Valuation) (X0 : svar) (S1 : propset M) (ϕ : Pattern), X0 ∉ free_svars ϕ → {| pr1 := update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0); pr2 := ϕ'^{svar:0↦fresh_svar ϕ'} |} = {| pr1 := update_svar_val X0 S1 ρ; pr2 := ϕ |} → eval (update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'} = eval (update_svar_val X0 S1 ρ) ϕ → eval (update_svar_val X0 S1 ρ) ϕ = eval ρ ϕ
Hfr: X ∉ free_svars ϕ'
Heqcall: LeastFixpointOf (λ S0 : propset M, eval (update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'}) = eval (update_svar_val X S ρ0) (mu , ϕ')
e: propset M

(let ρ' := update_svar_val (fresh_svar ϕ') e (update_svar_val X S ρ0) in eval ρ' ϕ'^{svar:0↦fresh_svar ϕ'}) = (let ρ' := update_svar_val (fresh_svar ϕ') e ρ0 in eval ρ' ϕ'^{svar:0↦fresh_svar ϕ'})
signature: Signature
M: Model
ρ0: Valuation
X: svar
S: propset M
ϕ': Pattern
H: (S0 : propset M) (ρ : Valuation) (X0 : svar) (S1 : propset M) (ϕ : Pattern), X0 ∉ free_svars ϕ → {| pr1 := update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0); pr2 := ϕ'^{svar:0↦fresh_svar ϕ'} |} = {| pr1 := update_svar_val X0 S1 ρ; pr2 := ϕ |} → eval (update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'} = eval (update_svar_val X0 S1 ρ) ϕ → eval (update_svar_val X0 S1 ρ) ϕ = eval ρ ϕ
Hfr: X ∉ free_svars ϕ'
Heqcall: LeastFixpointOf (λ S0 : propset M, eval (update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'}) = eval (update_svar_val X S ρ0) (mu , ϕ')
e: propset M

eval (update_svar_val (fresh_svar ϕ') e (update_svar_val X S ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'} = eval (update_svar_val (fresh_svar ϕ') e ρ0) ϕ'^{svar:0↦fresh_svar ϕ'}
signature: Signature
M: Model
ρ0: Valuation
X: svar
S: propset M
ϕ': Pattern
H: (S0 : propset M) (ρ : Valuation) (X0 : svar) (S1 : propset M) (ϕ : Pattern), X0 ∉ free_svars ϕ → {| pr1 := update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0); pr2 := ϕ'^{svar:0↦fresh_svar ϕ'} |} = {| pr1 := update_svar_val X0 S1 ρ; pr2 := ϕ |} → eval (update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'} = eval (update_svar_val X0 S1 ρ) ϕ → eval (update_svar_val X0 S1 ρ) ϕ = eval ρ ϕ
Hfr: X ∉ free_svars ϕ'
Heqcall: LeastFixpointOf (λ S0 : propset M, eval (update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'}) = eval (update_svar_val X S ρ0) (mu , ϕ')
e: propset M
Heq: fresh_svar ϕ' = X

eval (update_svar_val (fresh_svar ϕ') e (update_svar_val X S ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'} = eval (update_svar_val (fresh_svar ϕ') e ρ0) ϕ'^{svar:0↦fresh_svar ϕ'}
signature: Signature
M: Model
ρ0: Valuation
X: svar
S: propset M
ϕ': Pattern
H: (S0 : propset M) (ρ : Valuation) (X0 : svar) (S1 : propset M) (ϕ : Pattern), X0 ∉ free_svars ϕ → {| pr1 := update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0); pr2 := ϕ'^{svar:0↦fresh_svar ϕ'} |} = {| pr1 := update_svar_val X0 S1 ρ; pr2 := ϕ |} → eval (update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'} = eval (update_svar_val X0 S1 ρ) ϕ → eval (update_svar_val X0 S1 ρ) ϕ = eval ρ ϕ
Hfr: X ∉ free_svars ϕ'
Heqcall: LeastFixpointOf (λ S0 : propset M, eval (update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'}) = eval (update_svar_val X S ρ0) (mu , ϕ')
e: propset M
Hneq: fresh_svar ϕ' ≠ X
eval (update_svar_val (fresh_svar ϕ') e (update_svar_val X S ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'} = eval (update_svar_val (fresh_svar ϕ') e ρ0) ϕ'^{svar:0↦fresh_svar ϕ'}
signature: Signature
M: Model
ρ0: Valuation
X: svar
S: propset M
ϕ': Pattern
H: (S0 : propset M) (ρ : Valuation) (X0 : svar) (S1 : propset M) (ϕ : Pattern), X0 ∉ free_svars ϕ → {| pr1 := update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0); pr2 := ϕ'^{svar:0↦fresh_svar ϕ'} |} = {| pr1 := update_svar_val X0 S1 ρ; pr2 := ϕ |} → eval (update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'} = eval (update_svar_val X0 S1 ρ) ϕ → eval (update_svar_val X0 S1 ρ) ϕ = eval ρ ϕ
Hfr: X ∉ free_svars ϕ'
Heqcall: LeastFixpointOf (λ S0 : propset M, eval (update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'}) = eval (update_svar_val X S ρ0) (mu , ϕ')
e: propset M
Heq: fresh_svar ϕ' = X

eval (update_svar_val (fresh_svar ϕ') e (update_svar_val X S ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'} = eval (update_svar_val (fresh_svar ϕ') e ρ0) ϕ'^{svar:0↦fresh_svar ϕ'}
signature: Signature
M: Model
ρ0: Valuation
X: svar
S: propset M
ϕ': Pattern
H: (S0 : propset M) (ρ : Valuation) (X0 : svar) (S1 : propset M) (ϕ : Pattern), X0 ∉ free_svars ϕ → {| pr1 := update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0); pr2 := ϕ'^{svar:0↦fresh_svar ϕ'} |} = {| pr1 := update_svar_val X0 S1 ρ; pr2 := ϕ |} → eval (update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'} = eval (update_svar_val X0 S1 ρ) ϕ → eval (update_svar_val X0 S1 ρ) ϕ = eval ρ ϕ
Hfr: X ∉ free_svars ϕ'
Heqcall: LeastFixpointOf (λ S0 : propset M, eval (update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'}) = eval (update_svar_val X S ρ0) (mu , ϕ')
e: propset M
Heq: fresh_svar ϕ' = X

eval (update_svar_val X e (update_svar_val X S ρ0)) ϕ'^{svar:0↦X} = eval (update_svar_val X e ρ0) ϕ'^{svar:0↦X}
signature: Signature
M: Model
ρ0: Valuation
X: svar
S: propset M
ϕ': Pattern
H: (S0 : propset M) (ρ : Valuation) (X0 : svar) (S1 : propset M) (ϕ : Pattern), X0 ∉ free_svars ϕ → {| pr1 := update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0); pr2 := ϕ'^{svar:0↦fresh_svar ϕ'} |} = {| pr1 := update_svar_val X0 S1 ρ; pr2 := ϕ |} → eval (update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'} = eval (update_svar_val X0 S1 ρ) ϕ → eval (update_svar_val X0 S1 ρ) ϕ = eval ρ ϕ
Hfr: X ∉ free_svars ϕ'
Heqcall: LeastFixpointOf (λ S0 : propset M, eval (update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'}) = eval (update_svar_val X S ρ0) (mu , ϕ')
e: propset M
Heq: fresh_svar ϕ' = X

eval (update_svar_val X e ρ0) ϕ'^{svar:0↦X} = eval (update_svar_val X e ρ0) ϕ'^{svar:0↦X}
reflexivity.
signature: Signature
M: Model
ρ0: Valuation
X: svar
S: propset M
ϕ': Pattern
H: (S0 : propset M) (ρ : Valuation) (X0 : svar) (S1 : propset M) (ϕ : Pattern), X0 ∉ free_svars ϕ → {| pr1 := update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0); pr2 := ϕ'^{svar:0↦fresh_svar ϕ'} |} = {| pr1 := update_svar_val X0 S1 ρ; pr2 := ϕ |} → eval (update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'} = eval (update_svar_val X0 S1 ρ) ϕ → eval (update_svar_val X0 S1 ρ) ϕ = eval ρ ϕ
Hfr: X ∉ free_svars ϕ'
Heqcall: LeastFixpointOf (λ S0 : propset M, eval (update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'}) = eval (update_svar_val X S ρ0) (mu , ϕ')
e: propset M
Hneq: fresh_svar ϕ' ≠ X

eval (update_svar_val (fresh_svar ϕ') e (update_svar_val X S ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'} = eval (update_svar_val (fresh_svar ϕ') e ρ0) ϕ'^{svar:0↦fresh_svar ϕ'}
signature: Signature
M: Model
ρ0: Valuation
X: svar
S: propset M
ϕ': Pattern
H: (S0 : propset M) (ρ : Valuation) (X0 : svar) (S1 : propset M) (ϕ : Pattern), X0 ∉ free_svars ϕ → {| pr1 := update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0); pr2 := ϕ'^{svar:0↦fresh_svar ϕ'} |} = {| pr1 := update_svar_val X0 S1 ρ; pr2 := ϕ |} → eval (update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'} = eval (update_svar_val X0 S1 ρ) ϕ → eval (update_svar_val X0 S1 ρ) ϕ = eval ρ ϕ
Hfr: X ∉ free_svars ϕ'
Heqcall: LeastFixpointOf (λ S0 : propset M, eval (update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'}) = eval (update_svar_val X S ρ0) (mu , ϕ')
e: propset M
Hneq: fresh_svar ϕ' ≠ X

fresh_svar ϕ' ≠ X
signature: Signature
M: Model
ρ0: Valuation
X: svar
S: propset M
ϕ': Pattern
H: (S0 : propset M) (ρ : Valuation) (X0 : svar) (S1 : propset M) (ϕ : Pattern), X0 ∉ free_svars ϕ → {| pr1 := update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0); pr2 := ϕ'^{svar:0↦fresh_svar ϕ'} |} = {| pr1 := update_svar_val X0 S1 ρ; pr2 := ϕ |} → eval (update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'} = eval (update_svar_val X0 S1 ρ) ϕ → eval (update_svar_val X0 S1 ρ) ϕ = eval ρ ϕ
Hfr: X ∉ free_svars ϕ'
Heqcall: LeastFixpointOf (λ S0 : propset M, eval (update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'}) = eval (update_svar_val X S ρ0) (mu , ϕ')
e: propset M
Hneq: fresh_svar ϕ' ≠ X
eval (update_svar_val X S (update_svar_val (fresh_svar ϕ') e ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'} = eval (update_svar_val (fresh_svar ϕ') e ρ0) ϕ'^{svar:0↦fresh_svar ϕ'}
signature: Signature
M: Model
ρ0: Valuation
X: svar
S: propset M
ϕ': Pattern
H: (S0 : propset M) (ρ : Valuation) (X0 : svar) (S1 : propset M) (ϕ : Pattern), X0 ∉ free_svars ϕ → {| pr1 := update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0); pr2 := ϕ'^{svar:0↦fresh_svar ϕ'} |} = {| pr1 := update_svar_val X0 S1 ρ; pr2 := ϕ |} → eval (update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'} = eval (update_svar_val X0 S1 ρ) ϕ → eval (update_svar_val X0 S1 ρ) ϕ = eval ρ ϕ
Hfr: X ∉ free_svars ϕ'
Heqcall: LeastFixpointOf (λ S0 : propset M, eval (update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'}) = eval (update_svar_val X S ρ0) (mu , ϕ')
e: propset M
Hneq: fresh_svar ϕ' ≠ X

fresh_svar ϕ' ≠ X
apply Hneq.
signature: Signature
M: Model
ρ0: Valuation
X: svar
S: propset M
ϕ': Pattern
H: (S0 : propset M) (ρ : Valuation) (X0 : svar) (S1 : propset M) (ϕ : Pattern), X0 ∉ free_svars ϕ → {| pr1 := update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0); pr2 := ϕ'^{svar:0↦fresh_svar ϕ'} |} = {| pr1 := update_svar_val X0 S1 ρ; pr2 := ϕ |} → eval (update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'} = eval (update_svar_val X0 S1 ρ) ϕ → eval (update_svar_val X0 S1 ρ) ϕ = eval ρ ϕ
Hfr: X ∉ free_svars ϕ'
Heqcall: LeastFixpointOf (λ S0 : propset M, eval (update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'}) = eval (update_svar_val X S ρ0) (mu , ϕ')
e: propset M
Hneq: fresh_svar ϕ' ≠ X

eval (update_svar_val X S (update_svar_val (fresh_svar ϕ') e ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'} = eval (update_svar_val (fresh_svar ϕ') e ρ0) ϕ'^{svar:0↦fresh_svar ϕ'}
signature: Signature
M: Model
ρ0: Valuation
X: svar
S: propset M
ϕ': Pattern
H: (S0 : propset M) (ρ : Valuation) (X0 : svar) (S1 : propset M) (ϕ : Pattern), X0 ∉ free_svars ϕ → {| pr1 := update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0); pr2 := ϕ'^{svar:0↦fresh_svar ϕ'} |} = {| pr1 := update_svar_val X0 S1 ρ; pr2 := ϕ |} → eval (update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'} = eval (update_svar_val X0 S1 ρ) ϕ → eval (update_svar_val X0 S1 ρ) ϕ = eval ρ ϕ
Hfr: X ∉ free_svars ϕ'
Heqcall: LeastFixpointOf (λ S0 : propset M, eval (update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'}) = eval (update_svar_val X S ρ0) (mu , ϕ')
e: propset M
Hneq: fresh_svar ϕ' ≠ X

eval (update_svar_val (fresh_svar ϕ') e ρ0) ϕ'^{svar:0↦fresh_svar ϕ'} = eval (update_svar_val (fresh_svar ϕ') e ρ0) ϕ'^{svar:0↦fresh_svar ϕ'}
signature: Signature
M: Model
ρ0: Valuation
X: svar
S: propset M
ϕ': Pattern
H: (S0 : propset M) (ρ : Valuation) (X0 : svar) (S1 : propset M) (ϕ : Pattern), X0 ∉ free_svars ϕ → {| pr1 := update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0); pr2 := ϕ'^{svar:0↦fresh_svar ϕ'} |} = {| pr1 := update_svar_val X0 S1 ρ; pr2 := ϕ |} → eval (update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'} = eval (update_svar_val X0 S1 ρ) ϕ → eval (update_svar_val X0 S1 ρ) ϕ = eval ρ ϕ
Hfr: X ∉ free_svars ϕ'
Heqcall: LeastFixpointOf (λ S0 : propset M, eval (update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'}) = eval (update_svar_val X S ρ0) (mu , ϕ')
e: propset M
Hneq: fresh_svar ϕ' ≠ X
X ∉ free_svars ϕ'^{svar:0↦fresh_svar ϕ'}
signature: Signature
M: Model
ρ0: Valuation
X: svar
S: propset M
ϕ': Pattern
H: (S0 : propset M) (ρ : Valuation) (X0 : svar) (S1 : propset M) (ϕ : Pattern), X0 ∉ free_svars ϕ → {| pr1 := update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0); pr2 := ϕ'^{svar:0↦fresh_svar ϕ'} |} = {| pr1 := update_svar_val X0 S1 ρ; pr2 := ϕ |} → eval (update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'} = eval (update_svar_val X0 S1 ρ) ϕ → eval (update_svar_val X0 S1 ρ) ϕ = eval ρ ϕ
Hfr: X ∉ free_svars ϕ'
Heqcall: LeastFixpointOf (λ S0 : propset M, eval (update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'}) = eval (update_svar_val X S ρ0) (mu , ϕ')
e: propset M
Hneq: fresh_svar ϕ' ≠ X
{| pr1 := update_svar_val (fresh_svar ϕ') e (update_svar_val X S ρ0); pr2 := ϕ'^{svar:0↦fresh_svar ϕ'} |} = {| pr1 := update_svar_val X S (update_svar_val (fresh_svar ϕ') e ρ0); pr2 := ϕ'^{svar:0↦fresh_svar ϕ'} |}
signature: Signature
M: Model
ρ0: Valuation
X: svar
S: propset M
ϕ': Pattern
H: (S0 : propset M) (ρ : Valuation) (X0 : svar) (S1 : propset M) (ϕ : Pattern), X0 ∉ free_svars ϕ → {| pr1 := update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0); pr2 := ϕ'^{svar:0↦fresh_svar ϕ'} |} = {| pr1 := update_svar_val X0 S1 ρ; pr2 := ϕ |} → eval (update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'} = eval (update_svar_val X0 S1 ρ) ϕ → eval (update_svar_val X0 S1 ρ) ϕ = eval ρ ϕ
Hfr: X ∉ free_svars ϕ'
Heqcall: LeastFixpointOf (λ S0 : propset M, eval (update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'}) = eval (update_svar_val X S ρ0) (mu , ϕ')
e: propset M
Hneq: fresh_svar ϕ' ≠ X
eval (update_svar_val (fresh_svar ϕ') e (update_svar_val X S ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'} = eval (update_svar_val X S (update_svar_val (fresh_svar ϕ') e ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'}
signature: Signature
M: Model
ρ0: Valuation
X: svar
S: propset M
ϕ': Pattern
H: (S0 : propset M) (ρ : Valuation) (X0 : svar) (S1 : propset M) (ϕ : Pattern), X0 ∉ free_svars ϕ → {| pr1 := update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0); pr2 := ϕ'^{svar:0↦fresh_svar ϕ'} |} = {| pr1 := update_svar_val X0 S1 ρ; pr2 := ϕ |} → eval (update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'} = eval (update_svar_val X0 S1 ρ) ϕ → eval (update_svar_val X0 S1 ρ) ϕ = eval ρ ϕ
Hfr: X ∉ free_svars ϕ'
Heqcall: LeastFixpointOf (λ S0 : propset M, eval (update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'}) = eval (update_svar_val X S ρ0) (mu , ϕ')
e: propset M
Hneq: fresh_svar ϕ' ≠ X

eval (update_svar_val (fresh_svar ϕ') e ρ0) ϕ'^{svar:0↦fresh_svar ϕ'} = eval (update_svar_val (fresh_svar ϕ') e ρ0) ϕ'^{svar:0↦fresh_svar ϕ'}
reflexivity.
signature: Signature
M: Model
ρ0: Valuation
X: svar
S: propset M
ϕ': Pattern
H: (S0 : propset M) (ρ : Valuation) (X0 : svar) (S1 : propset M) (ϕ : Pattern), X0 ∉ free_svars ϕ → {| pr1 := update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0); pr2 := ϕ'^{svar:0↦fresh_svar ϕ'} |} = {| pr1 := update_svar_val X0 S1 ρ; pr2 := ϕ |} → eval (update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'} = eval (update_svar_val X0 S1 ρ) ϕ → eval (update_svar_val X0 S1 ρ) ϕ = eval ρ ϕ
Hfr: X ∉ free_svars ϕ'
Heqcall: LeastFixpointOf (λ S0 : propset M, eval (update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'}) = eval (update_svar_val X S ρ0) (mu , ϕ')
e: propset M
Hneq: fresh_svar ϕ' ≠ X

X ∉ free_svars ϕ'^{svar:0↦fresh_svar ϕ'}
signature: Signature
M: Model
ρ0: Valuation
X: svar
S: propset M
ϕ': Pattern
H: (S0 : propset M) (ρ : Valuation) (X0 : svar) (S1 : propset M) (ϕ : Pattern), X0 ∉ free_svars ϕ → {| pr1 := update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0); pr2 := ϕ'^{svar:0↦fresh_svar ϕ'} |} = {| pr1 := update_svar_val X0 S1 ρ; pr2 := ϕ |} → eval (update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'} = eval (update_svar_val X0 S1 ρ) ϕ → eval (update_svar_val X0 S1 ρ) ϕ = eval ρ ϕ
Hfr: X ∉ free_svars ϕ'
Heqcall: LeastFixpointOf (λ S0 : propset M, eval (update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'}) = eval (update_svar_val X S ρ0) (mu , ϕ')
e: propset M
Hneq: fresh_svar ϕ' ≠ X
{| pr1 := update_svar_val (fresh_svar ϕ') e (update_svar_val X S ρ0); pr2 := ϕ'^{svar:0↦fresh_svar ϕ'} |} = {| pr1 := update_svar_val X S (update_svar_val (fresh_svar ϕ') e ρ0); pr2 := ϕ'^{svar:0↦fresh_svar ϕ'} |}
signature: Signature
M: Model
ρ0: Valuation
X: svar
S: propset M
ϕ': Pattern
H: (S0 : propset M) (ρ : Valuation) (X0 : svar) (S1 : propset M) (ϕ : Pattern), X0 ∉ free_svars ϕ → {| pr1 := update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0); pr2 := ϕ'^{svar:0↦fresh_svar ϕ'} |} = {| pr1 := update_svar_val X0 S1 ρ; pr2 := ϕ |} → eval (update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'} = eval (update_svar_val X0 S1 ρ) ϕ → eval (update_svar_val X0 S1 ρ) ϕ = eval ρ ϕ
Hfr: X ∉ free_svars ϕ'
Heqcall: LeastFixpointOf (λ S0 : propset M, eval (update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'}) = eval (update_svar_val X S ρ0) (mu , ϕ')
e: propset M
Hneq: fresh_svar ϕ' ≠ X
eval (update_svar_val (fresh_svar ϕ') e (update_svar_val X S ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'} = eval (update_svar_val X S (update_svar_val (fresh_svar ϕ') e ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'}
signature: Signature
M: Model
ρ0: Valuation
X: svar
S: propset M
ϕ': Pattern
H: (S0 : propset M) (ρ : Valuation) (X0 : svar) (S1 : propset M) (ϕ : Pattern), X0 ∉ free_svars ϕ → {| pr1 := update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0); pr2 := ϕ'^{svar:0↦fresh_svar ϕ'} |} = {| pr1 := update_svar_val X0 S1 ρ; pr2 := ϕ |} → eval (update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'} = eval (update_svar_val X0 S1 ρ) ϕ → eval (update_svar_val X0 S1 ρ) ϕ = eval ρ ϕ
Hfr: X ∉ free_svars ϕ'
Heqcall: LeastFixpointOf (λ S0 : propset M, eval (update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'}) = eval (update_svar_val X S ρ0) (mu , ϕ')
e: propset M
Hneq: fresh_svar ϕ' ≠ X

X ∉ free_svars ϕ'^{svar:0↦fresh_svar ϕ'}
signature: Signature
M: Model
ρ0: Valuation
X: svar
S: propset M
ϕ': Pattern
H: (S0 : propset M) (ρ : Valuation) (X0 : svar) (S1 : propset M) (ϕ : Pattern), X0 ∉ free_svars ϕ → {| pr1 := update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0); pr2 := ϕ'^{svar:0↦fresh_svar ϕ'} |} = {| pr1 := update_svar_val X0 S1 ρ; pr2 := ϕ |} → eval (update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'} = eval (update_svar_val X0 S1 ρ) ϕ → eval (update_svar_val X0 S1 ρ) ϕ = eval ρ ϕ
Hfr: X ∉ free_svars ϕ'
Heqcall: LeastFixpointOf (λ S0 : propset M, eval (update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'}) = eval (update_svar_val X S ρ0) (mu , ϕ')
e: propset M
Hneq: fresh_svar ϕ' ≠ X
Contra: X ∈ free_svars ϕ'^{svar:0↦fresh_svar ϕ'}

False
signature: Signature
M: Model
ρ0: Valuation
X: svar
S: propset M
ϕ': Pattern
H: (S0 : propset M) (ρ : Valuation) (X0 : svar) (S1 : propset M) (ϕ : Pattern), X0 ∉ free_svars ϕ → {| pr1 := update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0); pr2 := ϕ'^{svar:0↦fresh_svar ϕ'} |} = {| pr1 := update_svar_val X0 S1 ρ; pr2 := ϕ |} → eval (update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'} = eval (update_svar_val X0 S1 ρ) ϕ → eval (update_svar_val X0 S1 ρ) ϕ = eval ρ ϕ
Hfr: X ∉ free_svars ϕ'
Heqcall: LeastFixpointOf (λ S0 : propset M, eval (update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'}) = eval (update_svar_val X S ρ0) (mu , ϕ')
e: propset M
Hneq: fresh_svar ϕ' ≠ X
Contra: X ∈ free_svars ϕ'^{svar:0↦fresh_svar ϕ'}
Hfeeo: free_svars ϕ'^{svar:0↦fresh_svar ϕ'} ⊆ {[fresh_svar ϕ']} ∪ free_svars ϕ'

False
signature: Signature
M: Model
ρ0: Valuation
X: svar
S: propset M
ϕ': Pattern
H: (S0 : propset M) (ρ : Valuation) (X0 : svar) (S1 : propset M) (ϕ : Pattern), X0 ∉ free_svars ϕ → {| pr1 := update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0); pr2 := ϕ'^{svar:0↦fresh_svar ϕ'} |} = {| pr1 := update_svar_val X0 S1 ρ; pr2 := ϕ |} → eval (update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'} = eval (update_svar_val X0 S1 ρ) ϕ → eval (update_svar_val X0 S1 ρ) ϕ = eval ρ ϕ
Hfr: X ∉ free_svars ϕ'
Heqcall: LeastFixpointOf (λ S0 : propset M, eval (update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'}) = eval (update_svar_val X S ρ0) (mu , ϕ')
e: propset M
Hneq: fresh_svar ϕ' ≠ X
Contra: X ∈ free_svars ϕ'^{svar:0↦fresh_svar ϕ'}
Hfeeo: x : svar, x ∈ free_svars ϕ'^{svar:0↦fresh_svar ϕ'} → x ∈ {[fresh_svar ϕ']} ∪ free_svars ϕ'

False
signature: Signature
M: Model
ρ0: Valuation
X: svar
S: propset M
ϕ': Pattern
H: (S0 : propset M) (ρ : Valuation) (X0 : svar) (S1 : propset M) (ϕ : Pattern), X0 ∉ free_svars ϕ → {| pr1 := update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0); pr2 := ϕ'^{svar:0↦fresh_svar ϕ'} |} = {| pr1 := update_svar_val X0 S1 ρ; pr2 := ϕ |} → eval (update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'} = eval (update_svar_val X0 S1 ρ) ϕ → eval (update_svar_val X0 S1 ρ) ϕ = eval ρ ϕ
Hfr: X ∉ free_svars ϕ'
Heqcall: LeastFixpointOf (λ S0 : propset M, eval (update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'}) = eval (update_svar_val X S ρ0) (mu , ϕ')
e: propset M
Hneq: fresh_svar ϕ' ≠ X
Contra: X ∈ free_svars ϕ'^{svar:0↦fresh_svar ϕ'}
Hfeeo: X ∈ {[fresh_svar ϕ']} ∪ free_svars ϕ'

False
signature: Signature
M: Model
ρ0: Valuation
X: svar
S: propset M
ϕ': Pattern
H: (S0 : propset M) (ρ : Valuation) (X0 : svar) (S1 : propset M) (ϕ : Pattern), X0 ∉ free_svars ϕ → {| pr1 := update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0); pr2 := ϕ'^{svar:0↦fresh_svar ϕ'} |} = {| pr1 := update_svar_val X0 S1 ρ; pr2 := ϕ |} → eval (update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'} = eval (update_svar_val X0 S1 ρ) ϕ → eval (update_svar_val X0 S1 ρ) ϕ = eval ρ ϕ
Hfr: X ∉ free_svars ϕ'
Heqcall: LeastFixpointOf (λ S0 : propset M, eval (update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'}) = eval (update_svar_val X S ρ0) (mu , ϕ')
e: propset M
Hneq: fresh_svar ϕ' ≠ X
Contra: X ∈ free_svars ϕ'^{svar:0↦fresh_svar ϕ'}
Hfeeo: X ∈ {[fresh_svar ϕ']} ∨ X ∈ free_svars ϕ'

False
signature: Signature
M: Model
ρ0: Valuation
X: svar
S: propset M
ϕ': Pattern
H: (S0 : propset M) (ρ : Valuation) (X0 : svar) (S1 : propset M) (ϕ : Pattern), X0 ∉ free_svars ϕ → {| pr1 := update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0); pr2 := ϕ'^{svar:0↦fresh_svar ϕ'} |} = {| pr1 := update_svar_val X0 S1 ρ; pr2 := ϕ |} → eval (update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'} = eval (update_svar_val X0 S1 ρ) ϕ → eval (update_svar_val X0 S1 ρ) ϕ = eval ρ ϕ
Hfr: X ∉ free_svars ϕ'
Heqcall: LeastFixpointOf (λ S0 : propset M, eval (update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'}) = eval (update_svar_val X S ρ0) (mu , ϕ')
e: propset M
Hneq: fresh_svar ϕ' ≠ X
Contra: X ∈ free_svars ϕ'^{svar:0↦fresh_svar ϕ'}
H': X ∈ {[fresh_svar ϕ']}

False
signature: Signature
M: Model
ρ0: Valuation
X: svar
S: propset M
ϕ': Pattern
H: (S0 : propset M) (ρ : Valuation) (X0 : svar) (S1 : propset M) (ϕ : Pattern), X0 ∉ free_svars ϕ → {| pr1 := update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0); pr2 := ϕ'^{svar:0↦fresh_svar ϕ'} |} = {| pr1 := update_svar_val X0 S1 ρ; pr2 := ϕ |} → eval (update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'} = eval (update_svar_val X0 S1 ρ) ϕ → eval (update_svar_val X0 S1 ρ) ϕ = eval ρ ϕ
Hfr: X ∉ free_svars ϕ'
Heqcall: LeastFixpointOf (λ S0 : propset M, eval (update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'}) = eval (update_svar_val X S ρ0) (mu , ϕ')
e: propset M
Hneq: fresh_svar ϕ' ≠ X
Contra: X ∈ free_svars ϕ'^{svar:0↦fresh_svar ϕ'}
H': X ∈ free_svars ϕ'
False
signature: Signature
M: Model
ρ0: Valuation
X: svar
S: propset M
ϕ': Pattern
H: (S0 : propset M) (ρ : Valuation) (X0 : svar) (S1 : propset M) (ϕ : Pattern), X0 ∉ free_svars ϕ → {| pr1 := update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0); pr2 := ϕ'^{svar:0↦fresh_svar ϕ'} |} = {| pr1 := update_svar_val X0 S1 ρ; pr2 := ϕ |} → eval (update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'} = eval (update_svar_val X0 S1 ρ) ϕ → eval (update_svar_val X0 S1 ρ) ϕ = eval ρ ϕ
Hfr: X ∉ free_svars ϕ'
Heqcall: LeastFixpointOf (λ S0 : propset M, eval (update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'}) = eval (update_svar_val X S ρ0) (mu , ϕ')
e: propset M
Hneq: fresh_svar ϕ' ≠ X
Contra: X ∈ free_svars ϕ'^{svar:0↦fresh_svar ϕ'}
H': X ∈ {[fresh_svar ϕ']}

False
signature: Signature
M: Model
ρ0: Valuation
X: svar
S: propset M
ϕ': Pattern
H: (S0 : propset M) (ρ : Valuation) (X0 : svar) (S1 : propset M) (ϕ : Pattern), X0 ∉ free_svars ϕ → {| pr1 := update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0); pr2 := ϕ'^{svar:0↦fresh_svar ϕ'} |} = {| pr1 := update_svar_val X0 S1 ρ; pr2 := ϕ |} → eval (update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'} = eval (update_svar_val X0 S1 ρ) ϕ → eval (update_svar_val X0 S1 ρ) ϕ = eval ρ ϕ
Hfr: X ∉ free_svars ϕ'
Heqcall: LeastFixpointOf (λ S0 : propset M, eval (update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'}) = eval (update_svar_val X S ρ0) (mu , ϕ')
e: propset M
Hneq: fresh_svar ϕ' ≠ X
Contra: X ∈ free_svars ϕ'^{svar:0↦fresh_svar ϕ'}
H': X = fresh_svar ϕ'

False
signature: Signature
M: Model
ρ0: Valuation
X: svar
S: propset M
ϕ': Pattern
H: (S0 : propset M) (ρ : Valuation) (X0 : svar) (S1 : propset M) (ϕ : Pattern), X0 ∉ free_svars ϕ → {| pr1 := update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0); pr2 := ϕ'^{svar:0↦fresh_svar ϕ'} |} = {| pr1 := update_svar_val X0 S1 ρ; pr2 := ϕ |} → eval (update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'} = eval (update_svar_val X0 S1 ρ) ϕ → eval (update_svar_val X0 S1 ρ) ϕ = eval ρ ϕ
Hfr: X ∉ free_svars ϕ'
Heqcall: LeastFixpointOf (λ S0 : propset M, eval (update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'}) = eval (update_svar_val X S ρ0) (mu , ϕ')
e: propset M
Hneq: fresh_svar ϕ' ≠ X
Contra: X ∈ free_svars ϕ'^{svar:0↦fresh_svar ϕ'}
H': fresh_svar ϕ' = X

False
contradiction.
signature: Signature
M: Model
ρ0: Valuation
X: svar
S: propset M
ϕ': Pattern
H: (S0 : propset M) (ρ : Valuation) (X0 : svar) (S1 : propset M) (ϕ : Pattern), X0 ∉ free_svars ϕ → {| pr1 := update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0); pr2 := ϕ'^{svar:0↦fresh_svar ϕ'} |} = {| pr1 := update_svar_val X0 S1 ρ; pr2 := ϕ |} → eval (update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'} = eval (update_svar_val X0 S1 ρ) ϕ → eval (update_svar_val X0 S1 ρ) ϕ = eval ρ ϕ
Hfr: X ∉ free_svars ϕ'
Heqcall: LeastFixpointOf (λ S0 : propset M, eval (update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'}) = eval (update_svar_val X S ρ0) (mu , ϕ')
e: propset M
Hneq: fresh_svar ϕ' ≠ X
Contra: X ∈ free_svars ϕ'^{svar:0↦fresh_svar ϕ'}
H': X ∈ free_svars ϕ'

False
contradiction.
signature: Signature
M: Model
ρ0: Valuation
X: svar
S: propset M
ϕ': Pattern
H: (S0 : propset M) (ρ : Valuation) (X0 : svar) (S1 : propset M) (ϕ : Pattern), X0 ∉ free_svars ϕ → {| pr1 := update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0); pr2 := ϕ'^{svar:0↦fresh_svar ϕ'} |} = {| pr1 := update_svar_val X0 S1 ρ; pr2 := ϕ |} → eval (update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'} = eval (update_svar_val X0 S1 ρ) ϕ → eval (update_svar_val X0 S1 ρ) ϕ = eval ρ ϕ
Hfr: X ∉ free_svars ϕ'
Heqcall: LeastFixpointOf (λ S0 : propset M, eval (update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'}) = eval (update_svar_val X S ρ0) (mu , ϕ')
e: propset M
Hneq: fresh_svar ϕ' ≠ X

{| pr1 := update_svar_val (fresh_svar ϕ') e (update_svar_val X S ρ0); pr2 := ϕ'^{svar:0↦fresh_svar ϕ'} |} = {| pr1 := update_svar_val X S (update_svar_val (fresh_svar ϕ') e ρ0); pr2 := ϕ'^{svar:0↦fresh_svar ϕ'} |}
signature: Signature
M: Model
ρ0: Valuation
X: svar
S: propset M
ϕ': Pattern
H: (S0 : propset M) (ρ : Valuation) (X0 : svar) (S1 : propset M) (ϕ : Pattern), X0 ∉ free_svars ϕ → {| pr1 := update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0); pr2 := ϕ'^{svar:0↦fresh_svar ϕ'} |} = {| pr1 := update_svar_val X0 S1 ρ; pr2 := ϕ |} → eval (update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'} = eval (update_svar_val X0 S1 ρ) ϕ → eval (update_svar_val X0 S1 ρ) ϕ = eval ρ ϕ
Hfr: X ∉ free_svars ϕ'
Heqcall: LeastFixpointOf (λ S0 : propset M, eval (update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'}) = eval (update_svar_val X S ρ0) (mu , ϕ')
e: propset M
Hneq: fresh_svar ϕ' ≠ X
eval (update_svar_val (fresh_svar ϕ') e (update_svar_val X S ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'} = eval (update_svar_val X S (update_svar_val (fresh_svar ϕ') e ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'}
signature: Signature
M: Model
ρ0: Valuation
X: svar
S: propset M
ϕ': Pattern
H: (S0 : propset M) (ρ : Valuation) (X0 : svar) (S1 : propset M) (ϕ : Pattern), X0 ∉ free_svars ϕ → {| pr1 := update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0); pr2 := ϕ'^{svar:0↦fresh_svar ϕ'} |} = {| pr1 := update_svar_val X0 S1 ρ; pr2 := ϕ |} → eval (update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'} = eval (update_svar_val X0 S1 ρ) ϕ → eval (update_svar_val X0 S1 ρ) ϕ = eval ρ ϕ
Hfr: X ∉ free_svars ϕ'
Heqcall: LeastFixpointOf (λ S0 : propset M, eval (update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'}) = eval (update_svar_val X S ρ0) (mu , ϕ')
e: propset M
Hneq: fresh_svar ϕ' ≠ X

{| pr1 := update_svar_val (fresh_svar ϕ') e (update_svar_val X S ρ0); pr2 := ϕ'^{svar:0↦fresh_svar ϕ'} |} = {| pr1 := update_svar_val X S (update_svar_val (fresh_svar ϕ') e ρ0); pr2 := ϕ'^{svar:0↦fresh_svar ϕ'} |}
signature: Signature
M: Model
ρ0: Valuation
X: svar
S: propset M
ϕ': Pattern
H: (S0 : propset M) (ρ : Valuation) (X0 : svar) (S1 : propset M) (ϕ : Pattern), X0 ∉ free_svars ϕ → {| pr1 := update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0); pr2 := ϕ'^{svar:0↦fresh_svar ϕ'} |} = {| pr1 := update_svar_val X0 S1 ρ; pr2 := ϕ |} → eval (update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'} = eval (update_svar_val X0 S1 ρ) ϕ → eval (update_svar_val X0 S1 ρ) ϕ = eval ρ ϕ
Hfr: X ∉ free_svars ϕ'
Heqcall: LeastFixpointOf (λ S0 : propset M, eval (update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'}) = eval (update_svar_val X S ρ0) (mu , ϕ')
e: propset M
Hneq: fresh_svar ϕ' ≠ X

update_svar_val (fresh_svar ϕ') e (update_svar_val X S ρ0) = update_svar_val X S (update_svar_val (fresh_svar ϕ') e ρ0)
signature: Signature
M: Model
ρ0: Valuation
X: svar
S: propset M
ϕ': Pattern
H: (S0 : propset M) (ρ : Valuation) (X0 : svar) (S1 : propset M) (ϕ : Pattern), X0 ∉ free_svars ϕ → {| pr1 := update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0); pr2 := ϕ'^{svar:0↦fresh_svar ϕ'} |} = {| pr1 := update_svar_val X0 S1 ρ; pr2 := ϕ |} → eval (update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'} = eval (update_svar_val X0 S1 ρ) ϕ → eval (update_svar_val X0 S1 ρ) ϕ = eval ρ ϕ
Hfr: X ∉ free_svars ϕ'
Heqcall: LeastFixpointOf (λ S0 : propset M, eval (update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'}) = eval (update_svar_val X S ρ0) (mu , ϕ')
e: propset M
Hneq: fresh_svar ϕ' ≠ X

fresh_svar ϕ' ≠ X
signature: Signature
M: Model
ρ0: Valuation
X: svar
S: propset M
ϕ': Pattern
H: (S0 : propset M) (ρ : Valuation) (X0 : svar) (S1 : propset M) (ϕ : Pattern), X0 ∉ free_svars ϕ → {| pr1 := update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0); pr2 := ϕ'^{svar:0↦fresh_svar ϕ'} |} = {| pr1 := update_svar_val X0 S1 ρ; pr2 := ϕ |} → eval (update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'} = eval (update_svar_val X0 S1 ρ) ϕ → eval (update_svar_val X0 S1 ρ) ϕ = eval ρ ϕ
Hfr: X ∉ free_svars ϕ'
Heqcall: LeastFixpointOf (λ S0 : propset M, eval (update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'}) = eval (update_svar_val X S ρ0) (mu , ϕ')
e: propset M
Hneq: fresh_svar ϕ' ≠ X
update_svar_val X S (update_svar_val (fresh_svar ϕ') e ρ0) = update_svar_val X S (update_svar_val (fresh_svar ϕ') e ρ0)
signature: Signature
M: Model
ρ0: Valuation
X: svar
S: propset M
ϕ': Pattern
H: (S0 : propset M) (ρ : Valuation) (X0 : svar) (S1 : propset M) (ϕ : Pattern), X0 ∉ free_svars ϕ → {| pr1 := update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0); pr2 := ϕ'^{svar:0↦fresh_svar ϕ'} |} = {| pr1 := update_svar_val X0 S1 ρ; pr2 := ϕ |} → eval (update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'} = eval (update_svar_val X0 S1 ρ) ϕ → eval (update_svar_val X0 S1 ρ) ϕ = eval ρ ϕ
Hfr: X ∉ free_svars ϕ'
Heqcall: LeastFixpointOf (λ S0 : propset M, eval (update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'}) = eval (update_svar_val X S ρ0) (mu , ϕ')
e: propset M
Hneq: fresh_svar ϕ' ≠ X

update_svar_val X S (update_svar_val (fresh_svar ϕ') e ρ0) = update_svar_val X S (update_svar_val (fresh_svar ϕ') e ρ0)
reflexivity.
signature: Signature
M: Model
ρ0: Valuation
X: svar
S: propset M
ϕ': Pattern
H: (S0 : propset M) (ρ : Valuation) (X0 : svar) (S1 : propset M) (ϕ : Pattern), X0 ∉ free_svars ϕ → {| pr1 := update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0); pr2 := ϕ'^{svar:0↦fresh_svar ϕ'} |} = {| pr1 := update_svar_val X0 S1 ρ; pr2 := ϕ |} → eval (update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'} = eval (update_svar_val X0 S1 ρ) ϕ → eval (update_svar_val X0 S1 ρ) ϕ = eval ρ ϕ
Hfr: X ∉ free_svars ϕ'
Heqcall: LeastFixpointOf (λ S0 : propset M, eval (update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'}) = eval (update_svar_val X S ρ0) (mu , ϕ')
e: propset M
Hneq: fresh_svar ϕ' ≠ X

eval (update_svar_val (fresh_svar ϕ') e (update_svar_val X S ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'} = eval (update_svar_val X S (update_svar_val (fresh_svar ϕ') e ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'}
signature: Signature
M: Model
ρ0: Valuation
X: svar
S: propset M
ϕ': Pattern
H: (S0 : propset M) (ρ : Valuation) (X0 : svar) (S1 : propset M) (ϕ : Pattern), X0 ∉ free_svars ϕ → {| pr1 := update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0); pr2 := ϕ'^{svar:0↦fresh_svar ϕ'} |} = {| pr1 := update_svar_val X0 S1 ρ; pr2 := ϕ |} → eval (update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'} = eval (update_svar_val X0 S1 ρ) ϕ → eval (update_svar_val X0 S1 ρ) ϕ = eval ρ ϕ
Hfr: X ∉ free_svars ϕ'
Heqcall: LeastFixpointOf (λ S0 : propset M, eval (update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'}) = eval (update_svar_val X S ρ0) (mu , ϕ')
e: propset M
Hneq: fresh_svar ϕ' ≠ X

eval (update_svar_val (fresh_svar ϕ') e (update_svar_val X S ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'} = eval (update_svar_val X S (update_svar_val (fresh_svar ϕ') e ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'}
signature: Signature
M: Model
ρ0: Valuation
X: svar
S: propset M
ϕ': Pattern
H: (S0 : propset M) (ρ : Valuation) (X0 : svar) (S1 : propset M) (ϕ : Pattern), X0 ∉ free_svars ϕ → {| pr1 := update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0); pr2 := ϕ'^{svar:0↦fresh_svar ϕ'} |} = {| pr1 := update_svar_val X0 S1 ρ; pr2 := ϕ |} → eval (update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'} = eval (update_svar_val X0 S1 ρ) ϕ → eval (update_svar_val X0 S1 ρ) ϕ = eval ρ ϕ
Hfr: X ∉ free_svars ϕ'
Heqcall: LeastFixpointOf (λ S0 : propset M, eval (update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'}) = eval (update_svar_val X S ρ0) (mu , ϕ')
e: propset M
Hneq: fresh_svar ϕ' ≠ X

update_svar_val (fresh_svar ϕ') e (update_svar_val X S ρ0) = update_svar_val X S (update_svar_val (fresh_svar ϕ') e ρ0)
signature: Signature
M: Model
ρ0: Valuation
X: svar
S: propset M
ϕ': Pattern
H: (S0 : propset M) (ρ : Valuation) (X0 : svar) (S1 : propset M) (ϕ : Pattern), X0 ∉ free_svars ϕ → {| pr1 := update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0); pr2 := ϕ'^{svar:0↦fresh_svar ϕ'} |} = {| pr1 := update_svar_val X0 S1 ρ; pr2 := ϕ |} → eval (update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'} = eval (update_svar_val X0 S1 ρ) ϕ → eval (update_svar_val X0 S1 ρ) ϕ = eval ρ ϕ
Hfr: X ∉ free_svars ϕ'
Heqcall: LeastFixpointOf (λ S0 : propset M, eval (update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'}) = eval (update_svar_val X S ρ0) (mu , ϕ')
e: propset M
Hneq: fresh_svar ϕ' ≠ X

fresh_svar ϕ' ≠ X
signature: Signature
M: Model
ρ0: Valuation
X: svar
S: propset M
ϕ': Pattern
H: (S0 : propset M) (ρ : Valuation) (X0 : svar) (S1 : propset M) (ϕ : Pattern), X0 ∉ free_svars ϕ → {| pr1 := update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0); pr2 := ϕ'^{svar:0↦fresh_svar ϕ'} |} = {| pr1 := update_svar_val X0 S1 ρ; pr2 := ϕ |} → eval (update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'} = eval (update_svar_val X0 S1 ρ) ϕ → eval (update_svar_val X0 S1 ρ) ϕ = eval ρ ϕ
Hfr: X ∉ free_svars ϕ'
Heqcall: LeastFixpointOf (λ S0 : propset M, eval (update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'}) = eval (update_svar_val X S ρ0) (mu , ϕ')
e: propset M
Hneq: fresh_svar ϕ' ≠ X
update_svar_val X S (update_svar_val (fresh_svar ϕ') e ρ0) = update_svar_val X S (update_svar_val (fresh_svar ϕ') e ρ0)
signature: Signature
M: Model
ρ0: Valuation
X: svar
S: propset M
ϕ': Pattern
H: (S0 : propset M) (ρ : Valuation) (X0 : svar) (S1 : propset M) (ϕ : Pattern), X0 ∉ free_svars ϕ → {| pr1 := update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0); pr2 := ϕ'^{svar:0↦fresh_svar ϕ'} |} = {| pr1 := update_svar_val X0 S1 ρ; pr2 := ϕ |} → eval (update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'} = eval (update_svar_val X0 S1 ρ) ϕ → eval (update_svar_val X0 S1 ρ) ϕ = eval ρ ϕ
Hfr: X ∉ free_svars ϕ'
Heqcall: LeastFixpointOf (λ S0 : propset M, eval (update_svar_val (fresh_svar ϕ') S0 (update_svar_val X S ρ0)) ϕ'^{svar:0↦fresh_svar ϕ'}) = eval (update_svar_val X S ρ0) (mu , ϕ')
e: propset M
Hneq: fresh_svar ϕ' ≠ X

update_svar_val X S (update_svar_val (fresh_svar ϕ') e ρ0) = update_svar_val X S (update_svar_val (fresh_svar ϕ') e ρ0)
reflexivity. } } Qed. (* Can change updated/opened fresh variable variable *)
signature: Signature
M: Model
sz: nat
ϕ: Pattern
dbi: db_index
ρ: Valuation

size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
signature: Signature
M: Model
sz: nat
ϕ: Pattern
dbi: db_index
ρ: Valuation

size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
signature: Signature
M: Model
sz: nat

(ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
signature: Signature
M: Model

(ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ 0 → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
(ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ S sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
signature: Signature
M: Model

(ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ 0 → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
signature: Signature
M: Model
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: size ϕ ≤ 0

( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
signature: Signature
M: Model
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: size ϕ ≤ 0

(X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}
signature: Signature
M: Model
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: size ϕ ≤ 0
(x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y}
signature: Signature
M: Model
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: size ϕ ≤ 0

(X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}
(* base case - svar *)
signature: Signature
M: Model
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: size ϕ ≤ 0
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X ϕ
HfrY: svar_is_fresh_in Y ϕ

eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}
signature: Signature
M: Model
x: evar
dbi: db_index
ρ: Valuation
Hsz: 00
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (patt_free_evar x)
HfrY: svar_is_fresh_in Y (patt_free_evar x)

eval (update_svar_val X S ρ) (patt_free_evar x)^{svar:dbi↦X} = eval (update_svar_val Y S ρ) (patt_free_evar x)^{svar:dbi↦Y}
signature: Signature
M: Model
x: svar
dbi: db_index
ρ: Valuation
Hsz: 00
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (patt_free_svar x)
HfrY: svar_is_fresh_in Y (patt_free_svar x)
eval (update_svar_val X S ρ) (patt_free_svar x)^{svar:dbi↦X} = eval (update_svar_val Y S ρ) (patt_free_svar x)^{svar:dbi↦Y}
signature: Signature
M: Model
n, dbi: db_index
ρ: Valuation
Hsz: 00
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (patt_bound_evar n)
HfrY: svar_is_fresh_in Y (patt_bound_evar n)
eval (update_svar_val X S ρ) (patt_bound_evar n)^{svar:dbi↦X} = eval (update_svar_val Y S ρ) (patt_bound_evar n)^{svar:dbi↦Y}
signature: Signature
M: Model
n, dbi: db_index
ρ: Valuation
Hsz: 00
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (patt_bound_svar n)
HfrY: svar_is_fresh_in Y (patt_bound_svar n)
eval (update_svar_val X S ρ) (patt_bound_svar n)^{svar:dbi↦X} = eval (update_svar_val Y S ρ) (patt_bound_svar n)^{svar:dbi↦Y}
signature: Signature
M: Model
sigma: symbols
dbi: db_index
ρ: Valuation
Hsz: 00
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (patt_sym sigma)
HfrY: svar_is_fresh_in Y (patt_sym sigma)
eval (update_svar_val X S ρ) (patt_sym sigma)^{svar:dbi↦X} = eval (update_svar_val Y S ρ) (patt_sym sigma)^{svar:dbi↦Y}
signature: Signature
M: Model
dbi: db_index
ρ: Valuation
Hsz: 00
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X ⊥
HfrY: svar_is_fresh_in Y ⊥
eval (update_svar_val X S ρ) ⊥^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ⊥^{svar:dbi↦Y}
signature: Signature
M: Model
x: evar
dbi: db_index
ρ: Valuation
Hsz: 00
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (patt_free_evar x)
HfrY: svar_is_fresh_in Y (patt_free_evar x)

eval (update_svar_val X S ρ) (patt_free_evar x)^{svar:dbi↦X} = eval (update_svar_val Y S ρ) (patt_free_evar x)^{svar:dbi↦Y}
signature: Signature
M: Model
x: evar
dbi: db_index
ρ: Valuation
Hsz: 00
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (patt_free_evar x)
HfrY: svar_is_fresh_in Y (patt_free_evar x)

{[evar_valuation (update_svar_val X S ρ) x]} = {[evar_valuation (update_svar_val Y S ρ) x]}
reflexivity.
signature: Signature
M: Model
x: svar
dbi: db_index
ρ: Valuation
Hsz: 00
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (patt_free_svar x)
HfrY: svar_is_fresh_in Y (patt_free_svar x)

eval (update_svar_val X S ρ) (patt_free_svar x)^{svar:dbi↦X} = eval (update_svar_val Y S ρ) (patt_free_svar x)^{svar:dbi↦Y}
signature: Signature
M: Model
x: svar
dbi: db_index
ρ: Valuation
Hsz: 00
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (patt_free_svar x)
HfrY: svar_is_fresh_in Y (patt_free_svar x)

svar_valuation (update_svar_val X S ρ) x = svar_valuation (update_svar_val Y S ρ) x
signature: Signature
M: Model
x: svar
dbi: db_index
ρ: Valuation
Hsz: 00
X, Y: svar
S: propset M
HfrX: X ∉ free_svars (patt_free_svar x)
HfrY: Y ∉ free_svars (patt_free_svar x)

svar_valuation (update_svar_val X S ρ) x = svar_valuation (update_svar_val Y S ρ) x
signature: Signature
M: Model
x: svar
dbi: db_index
ρ: Valuation
Hsz: 00
X, Y: svar
S: propset M
HfrX: X ∉ {[x]}
HfrY: Y ∉ {[x]}

svar_valuation (update_svar_val X S ρ) x = svar_valuation (update_svar_val Y S ρ) x
signature: Signature
M: Model
x: svar
dbi: db_index
ρ: Valuation
Hsz: 00
X, Y: svar
S: propset M
HfrX: X ≠ x
HfrY: Y ∉ {[x]}

svar_valuation (update_svar_val X S ρ) x = svar_valuation (update_svar_val Y S ρ) x
signature: Signature
M: Model
x: svar
dbi: db_index
ρ: Valuation
Hsz: 00
X, Y: svar
S: propset M
HfrX: X ≠ x
HfrY: Y ≠ x

svar_valuation (update_svar_val X S ρ) x = svar_valuation (update_svar_val Y S ρ) x
signature: Signature
M: Model
x: svar
dbi: db_index
ρ: Valuation
Hsz: 00
X, Y: svar
S: propset M
HfrX: X ≠ x
HfrY: Y ≠ x

svar_valuation {| evar_valuation := evar_valuation ρ; svar_valuation := λ sv' : svar, if decide (X = sv') then S else svar_valuation ρ sv' |} x = svar_valuation {| evar_valuation := evar_valuation ρ; svar_valuation := λ sv' : svar, if decide (Y = sv') then S else svar_valuation ρ sv' |} x
signature: Signature
M: Model
x: svar
dbi: db_index
ρₑ: evar → M
ρₛ: svar → propset M
Hsz: 00
X, Y: svar
S: propset M
HfrX: X ≠ x
HfrY: Y ≠ x

svar_valuation {| evar_valuation := evar_valuation {| evar_valuation := ρₑ; svar_valuation := ρₛ |}; svar_valuation := λ sv' : svar, if decide (X = sv') then S else svar_valuation {| evar_valuation := ρₑ; svar_valuation := ρₛ |} sv' |} x = svar_valuation {| evar_valuation := evar_valuation {| evar_valuation := ρₑ; svar_valuation := ρₛ |}; svar_valuation := λ sv' : svar, if decide (Y = sv') then S else svar_valuation {| evar_valuation := ρₑ; svar_valuation := ρₛ |} sv' |} x
signature: Signature
M: Model
x: svar
dbi: db_index
ρₑ: evar → M
ρₛ: svar → propset M
Hsz: 00
X, Y: svar
S: propset M
HfrX: X ≠ x
HfrY: Y ≠ x

(if decide (X = x) then S else ρₛ x) = (if decide (Y = x) then S else ρₛ x)
destruct (decide (X = x)),(decide (Y = x)); simpl; congruence.
signature: Signature
M: Model
n, dbi: db_index
ρ: Valuation
Hsz: 00
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (patt_bound_evar n)
HfrY: svar_is_fresh_in Y (patt_bound_evar n)

eval (update_svar_val X S ρ) (patt_bound_evar n)^{svar:dbi↦X} = eval (update_svar_val Y S ρ) (patt_bound_evar n)^{svar:dbi↦Y}
signature: Signature
M: Model
n, dbi: db_index
ρ: Valuation
Hsz: 00
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (patt_bound_evar n)
HfrY: svar_is_fresh_in Y (patt_bound_evar n)

∅ = ∅
reflexivity.
signature: Signature
M: Model
n, dbi: db_index
ρ: Valuation
Hsz: 00
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (patt_bound_svar n)
HfrY: svar_is_fresh_in Y (patt_bound_svar n)

eval (update_svar_val X S ρ) (patt_bound_svar n)^{svar:dbi↦X} = eval (update_svar_val Y S ρ) (patt_bound_svar n)^{svar:dbi↦Y}
signature: Signature
M: Model
n, dbi: db_index
ρ: Valuation
Hsz: 00
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (patt_bound_svar n)
HfrY: svar_is_fresh_in Y (patt_bound_svar n)

eval (update_svar_val X S ρ) (patt_bound_svar n)^[svar:dbi↦patt_free_svar X] = eval (update_svar_val Y S ρ) (patt_bound_svar n)^[svar:dbi↦patt_free_svar Y]
signature: Signature
M: Model
n, dbi: db_index
ρ: Valuation
Hsz: 00
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (patt_bound_svar n)
HfrY: svar_is_fresh_in Y (patt_bound_svar n)

eval (update_svar_val X S ρ) match compare_nat n dbi with | Nat_less _ _ _ => patt_bound_svar n | Nat_equal _ _ _ => patt_free_svar X | Nat_greater _ _ _ => patt_bound_svar (Nat.pred n) end = eval (update_svar_val Y S ρ) match compare_nat n dbi with | Nat_less _ _ _ => patt_bound_svar n | Nat_equal _ _ _ => patt_free_svar Y | Nat_greater _ _ _ => patt_bound_svar (Nat.pred n) end
signature: Signature
M: Model
n, dbi: db_index
ρ: Valuation
Hsz: 00
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (patt_bound_svar n)
HfrY: svar_is_fresh_in Y (patt_bound_svar n)
l: n < dbi
H: compare_nat n dbi = Nat_less n dbi l

eval (update_svar_val X S ρ) (patt_bound_svar n) = eval (update_svar_val Y S ρ) (patt_bound_svar n)
signature: Signature
M: Model
n, dbi: db_index
ρ: Valuation
Hsz: 00
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (patt_bound_svar n)
HfrY: svar_is_fresh_in Y (patt_bound_svar n)
e: n = dbi
H: compare_nat n dbi = Nat_equal n dbi e
eval (update_svar_val X S ρ) (patt_free_svar X) = eval (update_svar_val Y S ρ) (patt_free_svar Y)
signature: Signature
M: Model
n, dbi: db_index
ρ: Valuation
Hsz: 00
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (patt_bound_svar n)
HfrY: svar_is_fresh_in Y (patt_bound_svar n)
g: n > dbi
H: compare_nat n dbi = Nat_greater n dbi g
eval (update_svar_val X S ρ) (patt_bound_svar (Nat.pred n)) = eval (update_svar_val Y S ρ) (patt_bound_svar (Nat.pred n))
signature: Signature
M: Model
n, dbi: db_index
ρ: Valuation
Hsz: 00
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (patt_bound_svar n)
HfrY: svar_is_fresh_in Y (patt_bound_svar n)
l: n < dbi
H: compare_nat n dbi = Nat_less n dbi l

eval (update_svar_val X S ρ) (patt_bound_svar n) = eval (update_svar_val Y S ρ) (patt_bound_svar n)
signature: Signature
M: Model
n, dbi: db_index
ρ: Valuation
Hsz: 00
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (patt_bound_svar n)
HfrY: svar_is_fresh_in Y (patt_bound_svar n)
l: n < dbi
H: compare_nat n dbi = Nat_less n dbi l

∅ = ∅
reflexivity.
signature: Signature
M: Model
n, dbi: db_index
ρ: Valuation
Hsz: 00
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (patt_bound_svar n)
HfrY: svar_is_fresh_in Y (patt_bound_svar n)
e: n = dbi
H: compare_nat n dbi = Nat_equal n dbi e

eval (update_svar_val X S ρ) (patt_free_svar X) = eval (update_svar_val Y S ρ) (patt_free_svar Y)
signature: Signature
M: Model
n, dbi: db_index
ρ: Valuation
Hsz: 00
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (patt_bound_svar n)
HfrY: svar_is_fresh_in Y (patt_bound_svar n)
e: n = dbi
H: compare_nat n dbi = Nat_equal n dbi e

svar_valuation (update_svar_val X S ρ) X = svar_valuation (update_svar_val Y S ρ) Y
signature: Signature
M: Model
n, dbi: db_index
ρ: Valuation
Hsz: 00
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (patt_bound_svar n)
HfrY: svar_is_fresh_in Y (patt_bound_svar n)
e: n = dbi
H: compare_nat n dbi = Nat_equal n dbi e

S = S
reflexivity.
signature: Signature
M: Model
n, dbi: db_index
ρ: Valuation
Hsz: 00
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (patt_bound_svar n)
HfrY: svar_is_fresh_in Y (patt_bound_svar n)
g: n > dbi
H: compare_nat n dbi = Nat_greater n dbi g

eval (update_svar_val X S ρ) (patt_bound_svar (Nat.pred n)) = eval (update_svar_val Y S ρ) (patt_bound_svar (Nat.pred n))
signature: Signature
M: Model
n, dbi: db_index
ρ: Valuation
Hsz: 00
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (patt_bound_svar n)
HfrY: svar_is_fresh_in Y (patt_bound_svar n)
g: n > dbi
H: compare_nat n dbi = Nat_greater n dbi g

∅ = ∅
reflexivity.
signature: Signature
M: Model
sigma: symbols
dbi: db_index
ρ: Valuation
Hsz: 00
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (patt_sym sigma)
HfrY: svar_is_fresh_in Y (patt_sym sigma)

eval (update_svar_val X S ρ) (patt_sym sigma)^{svar:dbi↦X} = eval (update_svar_val Y S ρ) (patt_sym sigma)^{svar:dbi↦Y}
signature: Signature
M: Model
sigma: symbols
dbi: db_index
ρ: Valuation
Hsz: 00
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (patt_sym sigma)
HfrY: svar_is_fresh_in Y (patt_sym sigma)

sym_interp M sigma = sym_interp M sigma
reflexivity.
signature: Signature
M: Model
dbi: db_index
ρ: Valuation
Hsz: 00
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X ⊥
HfrY: svar_is_fresh_in Y ⊥

eval (update_svar_val X S ρ) ⊥^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ⊥^{svar:dbi↦Y}
signature: Signature
M: Model
dbi: db_index
ρ: Valuation
Hsz: 00
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X ⊥
HfrY: svar_is_fresh_in Y ⊥

∅ = ∅
reflexivity.
signature: Signature
M: Model
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: size ϕ ≤ 0

(x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y}
signature: Signature
M: Model
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: size ϕ ≤ 0

(x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y}
(* base case - evar *)
signature: Signature
M: Model
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: size ϕ ≤ 0
x, y: evar
c: M
Hfrx: evar_is_fresh_in x ϕ
Hfry: evar_is_fresh_in y ϕ

eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y}
signature: Signature
M: Model
x0: evar
dbi: db_index
ρ: Valuation
Hsz: 00
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (patt_free_evar x0)
Hfry: evar_is_fresh_in y (patt_free_evar x0)

eval (update_evar_val x c ρ) (patt_free_evar x0)^{evar:dbi↦x} = eval (update_evar_val y c ρ) (patt_free_evar x0)^{evar:dbi↦y}
signature: Signature
M: Model
x0: svar
dbi: db_index
ρ: Valuation
Hsz: 00
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (patt_free_svar x0)
Hfry: evar_is_fresh_in y (patt_free_svar x0)
eval (update_evar_val x c ρ) (patt_free_svar x0)^{evar:dbi↦x} = eval (update_evar_val y c ρ) (patt_free_svar x0)^{evar:dbi↦y}
signature: Signature
M: Model
n, dbi: db_index
ρ: Valuation
Hsz: 00
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (patt_bound_evar n)
Hfry: evar_is_fresh_in y (patt_bound_evar n)
eval (update_evar_val x c ρ) (patt_bound_evar n)^{evar:dbi↦x} = eval (update_evar_val y c ρ) (patt_bound_evar n)^{evar:dbi↦y}
signature: Signature
M: Model
n, dbi: db_index
ρ: Valuation
Hsz: 00
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (patt_bound_svar n)
Hfry: evar_is_fresh_in y (patt_bound_svar n)
eval (update_evar_val x c ρ) (patt_bound_svar n)^{evar:dbi↦x} = eval (update_evar_val y c ρ) (patt_bound_svar n)^{evar:dbi↦y}
signature: Signature
M: Model
sigma: symbols
dbi: db_index
ρ: Valuation
Hsz: 00
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (patt_sym sigma)
Hfry: evar_is_fresh_in y (patt_sym sigma)
eval (update_evar_val x c ρ) (patt_sym sigma)^{evar:dbi↦x} = eval (update_evar_val y c ρ) (patt_sym sigma)^{evar:dbi↦y}
signature: Signature
M: Model
dbi: db_index
ρ: Valuation
Hsz: 00
x, y: evar
c: M
Hfrx: evar_is_fresh_in x ⊥
Hfry: evar_is_fresh_in y ⊥
eval (update_evar_val x c ρ) ⊥^{evar:dbi↦x} = eval (update_evar_val y c ρ) ⊥^{evar:dbi↦y}
signature: Signature
M: Model
x0: evar
dbi: db_index
ρ: Valuation
Hsz: 00
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (patt_free_evar x0)
Hfry: evar_is_fresh_in y (patt_free_evar x0)

eval (update_evar_val x c ρ) (patt_free_evar x0)^{evar:dbi↦x} = eval (update_evar_val y c ρ) (patt_free_evar x0)^{evar:dbi↦y}
signature: Signature
M: Model
x0: evar
dbi: db_index
ρ: Valuation
Hsz: 00
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (patt_free_evar x0)
Hfry: evar_is_fresh_in y (patt_free_evar x0)

{[evar_valuation (update_evar_val x c ρ) x0]} = {[evar_valuation (update_evar_val y c ρ) x0]}
signature: Signature
M: Model
x0: evar
dbi: db_index
ρ: Valuation
Hsz: 00
x, y: evar
c: M
Hfrx: x ∉ free_evars (patt_free_evar x0)
Hfry: y ∉ free_evars (patt_free_evar x0)

{[evar_valuation (update_evar_val x c ρ) x0]} = {[evar_valuation (update_evar_val y c ρ) x0]}
signature: Signature
M: Model
x0: evar
dbi: db_index
ρ: Valuation
Hsz: 00
x, y: evar
c: M
Hfrx: x ∉ {[x0]}
Hfry: y ∉ {[x0]}

{[evar_valuation (update_evar_val x c ρ) x0]} = {[evar_valuation (update_evar_val y c ρ) x0]}
signature: Signature
M: Model
x0: evar
dbi: db_index
ρ: Valuation
Hsz: 00
x, y: evar
c: M
Hfrx: x ≠ x0
Hfry: y ∉ {[x0]}

{[evar_valuation (update_evar_val x c ρ) x0]} = {[evar_valuation (update_evar_val y c ρ) x0]}
signature: Signature
M: Model
x0: evar
dbi: db_index
ρ: Valuation
Hsz: 00
x, y: evar
c: M
Hfrx: x ≠ x0
Hfry: y ≠ x0

{[evar_valuation (update_evar_val x c ρ) x0]} = {[evar_valuation (update_evar_val y c ρ) x0]}
signature: Signature
M: Model
x0: evar
dbi: db_index
ρ: Valuation
Hsz: 00
x, y: evar
c: M
Hfrx: x ≠ x0
Hfry: y ≠ x0

evar_valuation (update_evar_val x c ρ) x0 = evar_valuation (update_evar_val y c ρ) x0
signature: Signature
M: Model
x0: evar
dbi: db_index
ρ: Valuation
Hsz: 00
x, y: evar
c: M
Hfrx: x ≠ x0
Hfry: y ≠ x0

evar_valuation {| evar_valuation := λ ev' : evar, if decide (x = ev') then c else evar_valuation ρ ev'; svar_valuation := svar_valuation ρ |} x0 = evar_valuation {| evar_valuation := λ ev' : evar, if decide (y = ev') then c else evar_valuation ρ ev'; svar_valuation := svar_valuation ρ |} x0
signature: Signature
M: Model
x0: evar
dbi: db_index
ρₑ: evar → M
ρₛ: svar → propset M
Hsz: 00
x, y: evar
c: M
Hfrx: x ≠ x0
Hfry: y ≠ x0

evar_valuation {| evar_valuation := λ ev' : evar, if decide (x = ev') then c else evar_valuation {| evar_valuation := ρₑ; svar_valuation := ρₛ |} ev'; svar_valuation := svar_valuation {| evar_valuation := ρₑ; svar_valuation := ρₛ |} |} x0 = evar_valuation {| evar_valuation := λ ev' : evar, if decide (y = ev') then c else evar_valuation {| evar_valuation := ρₑ; svar_valuation := ρₛ |} ev'; svar_valuation := svar_valuation {| evar_valuation := ρₑ; svar_valuation := ρₛ |} |} x0
signature: Signature
M: Model
x0: evar
dbi: db_index
ρₑ: evar → M
ρₛ: svar → propset M
Hsz: 00
x, y: evar
c: M
Hfrx: x ≠ x0
Hfry: y ≠ x0

(if decide (x = x0) then c else ρₑ x0) = (if decide (y = x0) then c else ρₑ x0)
destruct (decide (x = x0)),(decide (y = x0)); simpl; congruence.
signature: Signature
M: Model
x0: svar
dbi: db_index
ρ: Valuation
Hsz: 00
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (patt_free_svar x0)
Hfry: evar_is_fresh_in y (patt_free_svar x0)

eval (update_evar_val x c ρ) (patt_free_svar x0)^{evar:dbi↦x} = eval (update_evar_val y c ρ) (patt_free_svar x0)^{evar:dbi↦y}
signature: Signature
M: Model
x0: svar
dbi: db_index
ρ: Valuation
Hsz: 00
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (patt_free_svar x0)
Hfry: evar_is_fresh_in y (patt_free_svar x0)

svar_valuation (update_evar_val x c ρ) x0 = svar_valuation (update_evar_val y c ρ) x0
reflexivity.
signature: Signature
M: Model
n, dbi: db_index
ρ: Valuation
Hsz: 00
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (patt_bound_evar n)
Hfry: evar_is_fresh_in y (patt_bound_evar n)

eval (update_evar_val x c ρ) (patt_bound_evar n)^{evar:dbi↦x} = eval (update_evar_val y c ρ) (patt_bound_evar n)^{evar:dbi↦y}
signature: Signature
M: Model
n, dbi: db_index
ρ: Valuation
Hsz: 00
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (patt_bound_evar n)
Hfry: evar_is_fresh_in y (patt_bound_evar n)

eval (update_evar_val x c ρ) (patt_bound_evar n)^[evar:dbi↦patt_free_evar x] = eval (update_evar_val y c ρ) (patt_bound_evar n)^[evar:dbi↦patt_free_evar y]
signature: Signature
M: Model
n, dbi: db_index
ρ: Valuation
Hsz: 00
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (patt_bound_evar n)
Hfry: evar_is_fresh_in y (patt_bound_evar n)

eval (update_evar_val x c ρ) match compare_nat n dbi with | Nat_less _ _ _ => patt_bound_evar n | Nat_equal _ _ _ => patt_free_evar x | Nat_greater _ _ _ => patt_bound_evar (Nat.pred n) end = eval (update_evar_val y c ρ) match compare_nat n dbi with | Nat_less _ _ _ => patt_bound_evar n | Nat_equal _ _ _ => patt_free_evar y | Nat_greater _ _ _ => patt_bound_evar (Nat.pred n) end
signature: Signature
M: Model
n, dbi: db_index
ρ: Valuation
Hsz: 00
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (patt_bound_evar n)
Hfry: evar_is_fresh_in y (patt_bound_evar n)
l: n < dbi
H: compare_nat n dbi = Nat_less n dbi l

eval (update_evar_val x c ρ) (patt_bound_evar n) = eval (update_evar_val y c ρ) (patt_bound_evar n)
signature: Signature
M: Model
n, dbi: db_index
ρ: Valuation
Hsz: 00
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (patt_bound_evar n)
Hfry: evar_is_fresh_in y (patt_bound_evar n)
e: n = dbi
H: compare_nat n dbi = Nat_equal n dbi e
eval (update_evar_val x c ρ) (patt_free_evar x) = eval (update_evar_val y c ρ) (patt_free_evar y)
signature: Signature
M: Model
n, dbi: db_index
ρ: Valuation
Hsz: 00
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (patt_bound_evar n)
Hfry: evar_is_fresh_in y (patt_bound_evar n)
g: n > dbi
H: compare_nat n dbi = Nat_greater n dbi g
eval (update_evar_val x c ρ) (patt_bound_evar (Nat.pred n)) = eval (update_evar_val y c ρ) (patt_bound_evar (Nat.pred n))
signature: Signature
M: Model
n, dbi: db_index
ρ: Valuation
Hsz: 00
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (patt_bound_evar n)
Hfry: evar_is_fresh_in y (patt_bound_evar n)
l: n < dbi
H: compare_nat n dbi = Nat_less n dbi l

eval (update_evar_val x c ρ) (patt_bound_evar n) = eval (update_evar_val y c ρ) (patt_bound_evar n)
signature: Signature
M: Model
n, dbi: db_index
ρ: Valuation
Hsz: 00
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (patt_bound_evar n)
Hfry: evar_is_fresh_in y (patt_bound_evar n)
l: n < dbi
H: compare_nat n dbi = Nat_less n dbi l

∅ = ∅
reflexivity.
signature: Signature
M: Model
n, dbi: db_index
ρ: Valuation
Hsz: 00
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (patt_bound_evar n)
Hfry: evar_is_fresh_in y (patt_bound_evar n)
e: n = dbi
H: compare_nat n dbi = Nat_equal n dbi e

eval (update_evar_val x c ρ) (patt_free_evar x) = eval (update_evar_val y c ρ) (patt_free_evar y)
signature: Signature
M: Model
n, dbi: db_index
ρ: Valuation
Hsz: 00
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (patt_bound_evar n)
Hfry: evar_is_fresh_in y (patt_bound_evar n)
e: n = dbi
H: compare_nat n dbi = Nat_equal n dbi e

{[evar_valuation (update_evar_val x c ρ) x]} = {[evar_valuation (update_evar_val y c ρ) y]}
signature: Signature
M: Model
n, dbi: db_index
ρ: Valuation
Hsz: 00
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (patt_bound_evar n)
Hfry: evar_is_fresh_in y (patt_bound_evar n)
e: n = dbi
H: compare_nat n dbi = Nat_equal n dbi e

{[c]} = {[c]}
reflexivity.
signature: Signature
M: Model
n, dbi: db_index
ρ: Valuation
Hsz: 00
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (patt_bound_evar n)
Hfry: evar_is_fresh_in y (patt_bound_evar n)
g: n > dbi
H: compare_nat n dbi = Nat_greater n dbi g

eval (update_evar_val x c ρ) (patt_bound_evar (Nat.pred n)) = eval (update_evar_val y c ρ) (patt_bound_evar (Nat.pred n))
signature: Signature
M: Model
n, dbi: db_index
ρ: Valuation
Hsz: 00
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (patt_bound_evar n)
Hfry: evar_is_fresh_in y (patt_bound_evar n)
g: n > dbi
H: compare_nat n dbi = Nat_greater n dbi g

∅ = ∅
reflexivity.
signature: Signature
M: Model
n, dbi: db_index
ρ: Valuation
Hsz: 00
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (patt_bound_svar n)
Hfry: evar_is_fresh_in y (patt_bound_svar n)

eval (update_evar_val x c ρ) (patt_bound_svar n)^{evar:dbi↦x} = eval (update_evar_val y c ρ) (patt_bound_svar n)^{evar:dbi↦y}
signature: Signature
M: Model
n, dbi: db_index
ρ: Valuation
Hsz: 00
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (patt_bound_svar n)
Hfry: evar_is_fresh_in y (patt_bound_svar n)

∅ = ∅
reflexivity.
signature: Signature
M: Model
sigma: symbols
dbi: db_index
ρ: Valuation
Hsz: 00
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (patt_sym sigma)
Hfry: evar_is_fresh_in y (patt_sym sigma)

eval (update_evar_val x c ρ) (patt_sym sigma)^{evar:dbi↦x} = eval (update_evar_val y c ρ) (patt_sym sigma)^{evar:dbi↦y}
signature: Signature
M: Model
sigma: symbols
dbi: db_index
ρ: Valuation
Hsz: 00
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (patt_sym sigma)
Hfry: evar_is_fresh_in y (patt_sym sigma)

sym_interp M sigma = sym_interp M sigma
reflexivity.
signature: Signature
M: Model
dbi: db_index
ρ: Valuation
Hsz: 00
x, y: evar
c: M
Hfrx: evar_is_fresh_in x ⊥
Hfry: evar_is_fresh_in y ⊥

eval (update_evar_val x c ρ) ⊥^{evar:dbi↦x} = eval (update_evar_val y c ρ) ⊥^{evar:dbi↦y}
signature: Signature
M: Model
dbi: db_index
ρ: Valuation
Hsz: 00
x, y: evar
c: M
Hfrx: evar_is_fresh_in x ⊥
Hfry: evar_is_fresh_in y ⊥

∅ = ∅
reflexivity. }
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})

(ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ S sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: size ϕ ≤ S sz

( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: size ϕ ≤ S sz

(X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: size ϕ ≤ S sz
(x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: size ϕ ≤ S sz

(X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}
(* inductive case - svar *)
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: size ϕ ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X ϕ
HfrY: svar_is_fresh_in Y ϕ

eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
x: evar
dbi: db_index
ρ: Valuation
Hsz: 0 ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (patt_free_evar x)
HfrY: svar_is_fresh_in Y (patt_free_evar x)

eval (update_svar_val X S ρ) (patt_free_evar x)^{svar:dbi↦X} = eval (update_svar_val Y S ρ) (patt_free_evar x)^{svar:dbi↦Y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
x: svar
dbi: db_index
ρ: Valuation
Hsz: 0 ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (patt_free_svar x)
HfrY: svar_is_fresh_in Y (patt_free_svar x)
eval (update_svar_val X S ρ) (patt_free_svar x)^{svar:dbi↦X} = eval (update_svar_val Y S ρ) (patt_free_svar x)^{svar:dbi↦Y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
n, dbi: db_index
ρ: Valuation
Hsz: 0 ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (patt_bound_evar n)
HfrY: svar_is_fresh_in Y (patt_bound_evar n)
eval (update_svar_val X S ρ) (patt_bound_evar n)^{svar:dbi↦X} = eval (update_svar_val Y S ρ) (patt_bound_evar n)^{svar:dbi↦Y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
n, dbi: db_index
ρ: Valuation
Hsz: 0 ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (patt_bound_svar n)
HfrY: svar_is_fresh_in Y (patt_bound_svar n)
eval (update_svar_val X S ρ) (patt_bound_svar n)^{svar:dbi↦X} = eval (update_svar_val Y S ρ) (patt_bound_svar n)^{svar:dbi↦Y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
sigma: symbols
dbi: db_index
ρ: Valuation
Hsz: 0 ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (patt_sym sigma)
HfrY: svar_is_fresh_in Y (patt_sym sigma)
eval (update_svar_val X S ρ) (patt_sym sigma)^{svar:dbi↦X} = eval (update_svar_val Y S ρ) (patt_sym sigma)^{svar:dbi↦Y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ϕ1 $ ϕ2)
HfrY: svar_is_fresh_in Y (ϕ1 $ ϕ2)
eval (update_svar_val X S ρ) (ϕ1 $ ϕ2)^{svar:dbi↦X} = eval (update_svar_val Y S ρ) (ϕ1 $ ϕ2)^{svar:dbi↦Y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
dbi: db_index
ρ: Valuation
Hsz: 0 ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X ⊥
HfrY: svar_is_fresh_in Y ⊥
eval (update_svar_val X S ρ) ⊥^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ⊥^{svar:dbi↦Y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ϕ1 ---> ϕ2)
HfrY: svar_is_fresh_in Y (ϕ1 ---> ϕ2)
eval (update_svar_val X S ρ) (ϕ1 ---> ϕ2)^{svar:dbi↦X} = eval (update_svar_val Y S ρ) (ϕ1 ---> ϕ2)^{svar:dbi↦Y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ex , ϕ)
HfrY: svar_is_fresh_in Y (ex , ϕ)
eval (update_svar_val X S ρ) (ex , ϕ)^{svar:dbi↦X} = eval (update_svar_val Y S ρ) (ex , ϕ)^{svar:dbi↦Y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (mu , ϕ)
HfrY: svar_is_fresh_in Y (mu , ϕ)
eval (update_svar_val X S ρ) (mu , ϕ)^{svar:dbi↦X} = eval (update_svar_val Y S ρ) (mu , ϕ)^{svar:dbi↦Y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
x: evar
dbi: db_index
ρ: Valuation
Hsz: 0 ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (patt_free_evar x)
HfrY: svar_is_fresh_in Y (patt_free_evar x)

eval (update_svar_val X S ρ) (patt_free_evar x)^{svar:dbi↦X} = eval (update_svar_val Y S ρ) (patt_free_evar x)^{svar:dbi↦Y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
x: evar
dbi: db_index
ρ: Valuation
Hsz: 0 ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (patt_free_evar x)
HfrY: svar_is_fresh_in Y (patt_free_evar x)

size (patt_free_evar x) ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
x: evar
dbi: db_index
ρ: Valuation
Hsz: 0 ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (patt_free_evar x)
HfrY: svar_is_fresh_in Y (patt_free_evar x)
svar_is_fresh_in X (patt_free_evar x)
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
x: evar
dbi: db_index
ρ: Valuation
Hsz: 0 ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (patt_free_evar x)
HfrY: svar_is_fresh_in Y (patt_free_evar x)
svar_is_fresh_in Y (patt_free_evar x)
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
x: evar
dbi: db_index
ρ: Valuation
Hsz: 0 ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (patt_free_evar x)
HfrY: svar_is_fresh_in Y (patt_free_evar x)
eval (update_svar_val Y S ρ) (patt_free_evar x)^{svar:dbi↦Y} = eval (update_svar_val Y S ρ) (patt_free_evar x)^{svar:dbi↦Y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
x: evar
dbi: db_index
ρ: Valuation
Hsz: 0 ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (patt_free_evar x)
HfrY: svar_is_fresh_in Y (patt_free_evar x)

size (patt_free_evar x) ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
x: evar
dbi: db_index
ρ: Valuation
Hsz: 0 ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (patt_free_evar x)
HfrY: svar_is_fresh_in Y (patt_free_evar x)
svar_is_fresh_in X (patt_free_evar x)
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
x: evar
dbi: db_index
ρ: Valuation
Hsz: 0 ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (patt_free_evar x)
HfrY: svar_is_fresh_in Y (patt_free_evar x)
svar_is_fresh_in Y (patt_free_evar x)
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
x: evar
dbi: db_index
ρ: Valuation
Hsz: 0 ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (patt_free_evar x)
HfrY: svar_is_fresh_in Y (patt_free_evar x)

size (patt_free_evar x) ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
x: evar
dbi: db_index
ρ: Valuation
Hsz: 0 ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (patt_free_evar x)
HfrY: svar_is_fresh_in Y (patt_free_evar x)

0 ≤ sz
lia.
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
x: svar
dbi: db_index
ρ: Valuation
Hsz: 0 ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (patt_free_svar x)
HfrY: svar_is_fresh_in Y (patt_free_svar x)

eval (update_svar_val X S ρ) (patt_free_svar x)^{svar:dbi↦X} = eval (update_svar_val Y S ρ) (patt_free_svar x)^{svar:dbi↦Y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
x: svar
dbi: db_index
ρ: Valuation
Hsz: 0 ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (patt_free_svar x)
HfrY: svar_is_fresh_in Y (patt_free_svar x)

size (patt_free_svar x) ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
x: svar
dbi: db_index
ρ: Valuation
Hsz: 0 ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (patt_free_svar x)
HfrY: svar_is_fresh_in Y (patt_free_svar x)
svar_is_fresh_in X (patt_free_svar x)
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
x: svar
dbi: db_index
ρ: Valuation
Hsz: 0 ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (patt_free_svar x)
HfrY: svar_is_fresh_in Y (patt_free_svar x)
svar_is_fresh_in Y (patt_free_svar x)
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
x: svar
dbi: db_index
ρ: Valuation
Hsz: 0 ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (patt_free_svar x)
HfrY: svar_is_fresh_in Y (patt_free_svar x)
eval (update_svar_val Y S ρ) (patt_free_svar x)^{svar:dbi↦Y} = eval (update_svar_val Y S ρ) (patt_free_svar x)^{svar:dbi↦Y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
x: svar
dbi: db_index
ρ: Valuation
Hsz: 0 ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (patt_free_svar x)
HfrY: svar_is_fresh_in Y (patt_free_svar x)

size (patt_free_svar x) ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
x: svar
dbi: db_index
ρ: Valuation
Hsz: 0 ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (patt_free_svar x)
HfrY: svar_is_fresh_in Y (patt_free_svar x)
svar_is_fresh_in X (patt_free_svar x)
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
x: svar
dbi: db_index
ρ: Valuation
Hsz: 0 ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (patt_free_svar x)
HfrY: svar_is_fresh_in Y (patt_free_svar x)
svar_is_fresh_in Y (patt_free_svar x)
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
x: svar
dbi: db_index
ρ: Valuation
Hsz: 0 ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (patt_free_svar x)
HfrY: svar_is_fresh_in Y (patt_free_svar x)

size (patt_free_svar x) ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
x: svar
dbi: db_index
ρ: Valuation
Hsz: 0 ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (patt_free_svar x)
HfrY: svar_is_fresh_in Y (patt_free_svar x)

0 ≤ sz
lia.
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
n, dbi: db_index
ρ: Valuation
Hsz: 0 ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (patt_bound_evar n)
HfrY: svar_is_fresh_in Y (patt_bound_evar n)

eval (update_svar_val X S ρ) (patt_bound_evar n)^{svar:dbi↦X} = eval (update_svar_val Y S ρ) (patt_bound_evar n)^{svar:dbi↦Y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
n, dbi: db_index
ρ: Valuation
Hsz: 0 ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (patt_bound_evar n)
HfrY: svar_is_fresh_in Y (patt_bound_evar n)

size (patt_bound_evar n) ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
n, dbi: db_index
ρ: Valuation
Hsz: 0 ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (patt_bound_evar n)
HfrY: svar_is_fresh_in Y (patt_bound_evar n)
svar_is_fresh_in X (patt_bound_evar n)
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
n, dbi: db_index
ρ: Valuation
Hsz: 0 ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (patt_bound_evar n)
HfrY: svar_is_fresh_in Y (patt_bound_evar n)
svar_is_fresh_in Y (patt_bound_evar n)
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
n, dbi: db_index
ρ: Valuation
Hsz: 0 ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (patt_bound_evar n)
HfrY: svar_is_fresh_in Y (patt_bound_evar n)
eval (update_svar_val Y S ρ) (patt_bound_evar n)^{svar:dbi↦Y} = eval (update_svar_val Y S ρ) (patt_bound_evar n)^{svar:dbi↦Y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
n, dbi: db_index
ρ: Valuation
Hsz: 0 ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (patt_bound_evar n)
HfrY: svar_is_fresh_in Y (patt_bound_evar n)

size (patt_bound_evar n) ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
n, dbi: db_index
ρ: Valuation
Hsz: 0 ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (patt_bound_evar n)
HfrY: svar_is_fresh_in Y (patt_bound_evar n)
svar_is_fresh_in X (patt_bound_evar n)
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
n, dbi: db_index
ρ: Valuation
Hsz: 0 ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (patt_bound_evar n)
HfrY: svar_is_fresh_in Y (patt_bound_evar n)
svar_is_fresh_in Y (patt_bound_evar n)
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
n, dbi: db_index
ρ: Valuation
Hsz: 0 ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (patt_bound_evar n)
HfrY: svar_is_fresh_in Y (patt_bound_evar n)

size (patt_bound_evar n) ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
n, dbi: db_index
ρ: Valuation
Hsz: 0 ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (patt_bound_evar n)
HfrY: svar_is_fresh_in Y (patt_bound_evar n)

0 ≤ sz
lia.
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
n, dbi: db_index
ρ: Valuation
Hsz: 0 ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (patt_bound_svar n)
HfrY: svar_is_fresh_in Y (patt_bound_svar n)

eval (update_svar_val X S ρ) (patt_bound_svar n)^{svar:dbi↦X} = eval (update_svar_val Y S ρ) (patt_bound_svar n)^{svar:dbi↦Y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
n, dbi: db_index
ρ: Valuation
Hsz: 0 ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (patt_bound_svar n)
HfrY: svar_is_fresh_in Y (patt_bound_svar n)

size (patt_bound_svar n) ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
n, dbi: db_index
ρ: Valuation
Hsz: 0 ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (patt_bound_svar n)
HfrY: svar_is_fresh_in Y (patt_bound_svar n)
svar_is_fresh_in X (patt_bound_svar n)
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
n, dbi: db_index
ρ: Valuation
Hsz: 0 ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (patt_bound_svar n)
HfrY: svar_is_fresh_in Y (patt_bound_svar n)
svar_is_fresh_in Y (patt_bound_svar n)
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
n, dbi: db_index
ρ: Valuation
Hsz: 0 ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (patt_bound_svar n)
HfrY: svar_is_fresh_in Y (patt_bound_svar n)
eval (update_svar_val Y S ρ) (patt_bound_svar n)^{svar:dbi↦Y} = eval (update_svar_val Y S ρ) (patt_bound_svar n)^{svar:dbi↦Y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
n, dbi: db_index
ρ: Valuation
Hsz: 0 ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (patt_bound_svar n)
HfrY: svar_is_fresh_in Y (patt_bound_svar n)

size (patt_bound_svar n) ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
n, dbi: db_index
ρ: Valuation
Hsz: 0 ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (patt_bound_svar n)
HfrY: svar_is_fresh_in Y (patt_bound_svar n)
svar_is_fresh_in X (patt_bound_svar n)
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
n, dbi: db_index
ρ: Valuation
Hsz: 0 ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (patt_bound_svar n)
HfrY: svar_is_fresh_in Y (patt_bound_svar n)
svar_is_fresh_in Y (patt_bound_svar n)
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
n, dbi: db_index
ρ: Valuation
Hsz: 0 ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (patt_bound_svar n)
HfrY: svar_is_fresh_in Y (patt_bound_svar n)

size (patt_bound_svar n) ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
n, dbi: db_index
ρ: Valuation
Hsz: 0 ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (patt_bound_svar n)
HfrY: svar_is_fresh_in Y (patt_bound_svar n)

0 ≤ sz
lia.
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
sigma: symbols
dbi: db_index
ρ: Valuation
Hsz: 0 ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (patt_sym sigma)
HfrY: svar_is_fresh_in Y (patt_sym sigma)

eval (update_svar_val X S ρ) (patt_sym sigma)^{svar:dbi↦X} = eval (update_svar_val Y S ρ) (patt_sym sigma)^{svar:dbi↦Y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
sigma: symbols
dbi: db_index
ρ: Valuation
Hsz: 0 ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (patt_sym sigma)
HfrY: svar_is_fresh_in Y (patt_sym sigma)

size (patt_sym sigma) ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
sigma: symbols
dbi: db_index
ρ: Valuation
Hsz: 0 ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (patt_sym sigma)
HfrY: svar_is_fresh_in Y (patt_sym sigma)
svar_is_fresh_in X (patt_sym sigma)
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
sigma: symbols
dbi: db_index
ρ: Valuation
Hsz: 0 ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (patt_sym sigma)
HfrY: svar_is_fresh_in Y (patt_sym sigma)
svar_is_fresh_in Y (patt_sym sigma)
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
sigma: symbols
dbi: db_index
ρ: Valuation
Hsz: 0 ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (patt_sym sigma)
HfrY: svar_is_fresh_in Y (patt_sym sigma)
eval (update_svar_val Y S ρ) (patt_sym sigma)^{svar:dbi↦Y} = eval (update_svar_val Y S ρ) (patt_sym sigma)^{svar:dbi↦Y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
sigma: symbols
dbi: db_index
ρ: Valuation
Hsz: 0 ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (patt_sym sigma)
HfrY: svar_is_fresh_in Y (patt_sym sigma)

size (patt_sym sigma) ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
sigma: symbols
dbi: db_index
ρ: Valuation
Hsz: 0 ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (patt_sym sigma)
HfrY: svar_is_fresh_in Y (patt_sym sigma)
svar_is_fresh_in X (patt_sym sigma)
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
sigma: symbols
dbi: db_index
ρ: Valuation
Hsz: 0 ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (patt_sym sigma)
HfrY: svar_is_fresh_in Y (patt_sym sigma)
svar_is_fresh_in Y (patt_sym sigma)
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
sigma: symbols
dbi: db_index
ρ: Valuation
Hsz: 0 ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (patt_sym sigma)
HfrY: svar_is_fresh_in Y (patt_sym sigma)

size (patt_sym sigma) ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
sigma: symbols
dbi: db_index
ρ: Valuation
Hsz: 0 ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (patt_sym sigma)
HfrY: svar_is_fresh_in Y (patt_sym sigma)

0 ≤ sz
lia.
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ϕ1 $ ϕ2)
HfrY: svar_is_fresh_in Y (ϕ1 $ ϕ2)

eval (update_svar_val X S ρ) (ϕ1 $ ϕ2)^{svar:dbi↦X} = eval (update_svar_val Y S ρ) (ϕ1 $ ϕ2)^{svar:dbi↦Y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ϕ1 $ ϕ2)
HfrY: svar_is_fresh_in Y (ϕ1 $ ϕ2)

app_ext (eval (update_svar_val X S ρ) ((fix bsvar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => patt_bound_evar n | patt_bound_svar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_svar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_svar (Nat.pred n) end | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bsvar_subst psi x phi1 $ bsvar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bsvar_subst psi x phi1 ---> bsvar_subst psi x phi2 | ex , phi' => ex , bsvar_subst psi x phi' | mu , phi' => mu , bsvar_subst psi (Datatypes.S x) phi' end) (patt_free_svar X) dbi ϕ1)) (eval (update_svar_val X S ρ) ((fix bsvar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => patt_bound_evar n | patt_bound_svar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_svar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_svar (Nat.pred n) end | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bsvar_subst psi x phi1 $ bsvar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bsvar_subst psi x phi1 ---> bsvar_subst psi x phi2 | ex , phi' => ex , bsvar_subst psi x phi' | mu , phi' => mu , bsvar_subst psi (Datatypes.S x) phi' end) (patt_free_svar X) dbi ϕ2)) = app_ext (eval (update_svar_val Y S ρ) ((fix bsvar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => patt_bound_evar n | patt_bound_svar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_svar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_svar (Nat.pred n) end | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bsvar_subst psi x phi1 $ bsvar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bsvar_subst psi x phi1 ---> bsvar_subst psi x phi2 | ex , phi' => ex , bsvar_subst psi x phi' | mu , phi' => mu , bsvar_subst psi (Datatypes.S x) phi' end) (patt_free_svar Y) dbi ϕ1)) (eval (update_svar_val Y S ρ) ((fix bsvar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => patt_bound_evar n | patt_bound_svar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_svar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_svar (Nat.pred n) end | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bsvar_subst psi x phi1 $ bsvar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bsvar_subst psi x phi1 ---> bsvar_subst psi x phi2 | ex , phi' => ex , bsvar_subst psi x phi' | mu , phi' => mu , bsvar_subst psi (Datatypes.S x) phi' end) (patt_free_svar Y) dbi ϕ2))
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ϕ1 $ ϕ2)
HfrY: svar_is_fresh_in Y (ϕ1 $ ϕ2)

app_ext (eval (update_svar_val X S ρ) ((fix bsvar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => patt_bound_evar n | patt_bound_svar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_svar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_svar (Nat.pred n) end | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bsvar_subst psi x phi1 $ bsvar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bsvar_subst psi x phi1 ---> bsvar_subst psi x phi2 | ex , phi' => ex , bsvar_subst psi x phi' | mu , phi' => mu , bsvar_subst psi (Datatypes.S x) phi' end) (patt_free_svar X) dbi ϕ1)) (eval (update_svar_val X S ρ) ((fix bsvar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => patt_bound_evar n | patt_bound_svar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_svar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_svar (Nat.pred n) end | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bsvar_subst psi x phi1 $ bsvar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bsvar_subst psi x phi1 ---> bsvar_subst psi x phi2 | ex , phi' => ex , bsvar_subst psi x phi' | mu , phi' => mu , bsvar_subst psi (Datatypes.S x) phi' end) (patt_free_svar X) dbi ϕ2)) = app_ext (eval (update_svar_val Y S ρ) ((fix bsvar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => patt_bound_evar n | patt_bound_svar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_svar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_svar (Nat.pred n) end | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bsvar_subst psi x phi1 $ bsvar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bsvar_subst psi x phi1 ---> bsvar_subst psi x phi2 | ex , phi' => ex , bsvar_subst psi x phi' | mu , phi' => mu , bsvar_subst psi (Datatypes.S x) phi' end) (patt_free_svar Y) dbi ϕ1)) (eval (update_svar_val Y S ρ) ((fix bsvar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => patt_bound_evar n | patt_bound_svar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_svar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_svar (Nat.pred n) end | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bsvar_subst psi x phi1 $ bsvar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bsvar_subst psi x phi1 ---> bsvar_subst psi x phi2 | ex , phi' => ex , bsvar_subst psi x phi' | mu , phi' => mu , bsvar_subst psi (Datatypes.S x) phi' end) (patt_free_svar Y) dbi ϕ2))
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ϕ1 $ ϕ2)
HfrY: svar_is_fresh_in Y (ϕ1 $ ϕ2)

size ϕ1 ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ϕ1 $ ϕ2)
HfrY: svar_is_fresh_in Y (ϕ1 $ ϕ2)
svar_is_fresh_in X ϕ1
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ϕ1 $ ϕ2)
HfrY: svar_is_fresh_in Y (ϕ1 $ ϕ2)
svar_is_fresh_in Y ϕ1
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ϕ1 $ ϕ2)
HfrY: svar_is_fresh_in Y (ϕ1 $ ϕ2)
app_ext (eval (update_svar_val Y S ρ) ϕ1^{svar:dbi↦Y}) (eval (update_svar_val X S ρ) ((fix bsvar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => patt_bound_evar n | patt_bound_svar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_svar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_svar (Nat.pred n) end | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bsvar_subst psi x phi1 $ bsvar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bsvar_subst psi x phi1 ---> bsvar_subst psi x phi2 | ex , phi' => ex , bsvar_subst psi x phi' | mu , phi' => mu , bsvar_subst psi (Datatypes.S x) phi' end) (patt_free_svar X) dbi ϕ2)) = app_ext (eval (update_svar_val Y S ρ) ((fix bsvar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => patt_bound_evar n | patt_bound_svar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_svar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_svar (Nat.pred n) end | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bsvar_subst psi x phi1 $ bsvar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bsvar_subst psi x phi1 ---> bsvar_subst psi x phi2 | ex , phi' => ex , bsvar_subst psi x phi' | mu , phi' => mu , bsvar_subst psi (Datatypes.S x) phi' end) (patt_free_svar Y) dbi ϕ1)) (eval (update_svar_val Y S ρ) ((fix bsvar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => patt_bound_evar n | patt_bound_svar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_svar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_svar (Nat.pred n) end | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bsvar_subst psi x phi1 $ bsvar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bsvar_subst psi x phi1 ---> bsvar_subst psi x phi2 | ex , phi' => ex , bsvar_subst psi x phi' | mu , phi' => mu , bsvar_subst psi (Datatypes.S x) phi' end) (patt_free_svar Y) dbi ϕ2))
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ϕ1 $ ϕ2)
HfrY: svar_is_fresh_in Y (ϕ1 $ ϕ2)

size ϕ1 ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ϕ1 $ ϕ2)
HfrY: svar_is_fresh_in Y (ϕ1 $ ϕ2)
svar_is_fresh_in X ϕ1
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ϕ1 $ ϕ2)
HfrY: svar_is_fresh_in Y (ϕ1 $ ϕ2)
svar_is_fresh_in Y ϕ1
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ϕ1 $ ϕ2)
HfrY: svar_is_fresh_in Y (ϕ1 $ ϕ2)
size ϕ2 ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ϕ1 $ ϕ2)
HfrY: svar_is_fresh_in Y (ϕ1 $ ϕ2)
svar_is_fresh_in X ϕ2
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ϕ1 $ ϕ2)
HfrY: svar_is_fresh_in Y (ϕ1 $ ϕ2)
svar_is_fresh_in Y ϕ2
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ϕ1 $ ϕ2)
HfrY: svar_is_fresh_in Y (ϕ1 $ ϕ2)
app_ext (eval (update_svar_val Y S ρ) ϕ1^{svar:dbi↦Y}) (eval (update_svar_val Y S ρ) ϕ2^{svar:dbi↦Y}) = app_ext (eval (update_svar_val Y S ρ) ((fix bsvar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => patt_bound_evar n | patt_bound_svar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_svar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_svar (Nat.pred n) end | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bsvar_subst psi x phi1 $ bsvar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bsvar_subst psi x phi1 ---> bsvar_subst psi x phi2 | ex , phi' => ex , bsvar_subst psi x phi' | mu , phi' => mu , bsvar_subst psi (Datatypes.S x) phi' end) (patt_free_svar Y) dbi ϕ1)) (eval (update_svar_val Y S ρ) ((fix bsvar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => patt_bound_evar n | patt_bound_svar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_svar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_svar (Nat.pred n) end | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bsvar_subst psi x phi1 $ bsvar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bsvar_subst psi x phi1 ---> bsvar_subst psi x phi2 | ex , phi' => ex , bsvar_subst psi x phi' | mu , phi' => mu , bsvar_subst psi (Datatypes.S x) phi' end) (patt_free_svar Y) dbi ϕ2))
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ϕ1 $ ϕ2)
HfrY: svar_is_fresh_in Y (ϕ1 $ ϕ2)

svar_is_fresh_in X ϕ1
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ϕ1 $ ϕ2)
HfrY: svar_is_fresh_in Y (ϕ1 $ ϕ2)
svar_is_fresh_in Y ϕ1
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ϕ1 $ ϕ2)
HfrY: svar_is_fresh_in Y (ϕ1 $ ϕ2)
size ϕ2 ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ϕ1 $ ϕ2)
HfrY: svar_is_fresh_in Y (ϕ1 $ ϕ2)
svar_is_fresh_in X ϕ2
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ϕ1 $ ϕ2)
HfrY: svar_is_fresh_in Y (ϕ1 $ ϕ2)
svar_is_fresh_in Y ϕ2
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ϕ1 $ ϕ2)
HfrY: svar_is_fresh_in Y (ϕ1 $ ϕ2)
app_ext (eval (update_svar_val Y S ρ) ϕ1^{svar:dbi↦Y}) (eval (update_svar_val Y S ρ) ϕ2^{svar:dbi↦Y}) = app_ext (eval (update_svar_val Y S ρ) ((fix bsvar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => patt_bound_evar n | patt_bound_svar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_svar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_svar (Nat.pred n) end | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bsvar_subst psi x phi1 $ bsvar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bsvar_subst psi x phi1 ---> bsvar_subst psi x phi2 | ex , phi' => ex , bsvar_subst psi x phi' | mu , phi' => mu , bsvar_subst psi (Datatypes.S x) phi' end) (patt_free_svar Y) dbi ϕ1)) (eval (update_svar_val Y S ρ) ((fix bsvar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => patt_bound_evar n | patt_bound_svar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_svar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_svar (Nat.pred n) end | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bsvar_subst psi x phi1 $ bsvar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bsvar_subst psi x phi1 ---> bsvar_subst psi x phi2 | ex , phi' => ex , bsvar_subst psi x phi' | mu , phi' => mu , bsvar_subst psi (Datatypes.S x) phi' end) (patt_free_svar Y) dbi ϕ2))
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ϕ1 $ ϕ2)
HfrY: svar_is_fresh_in Y (ϕ1 $ ϕ2)

svar_is_fresh_in X (ϕ1 $ ?ϕ₂)
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ϕ1 $ ϕ2)
HfrY: svar_is_fresh_in Y (ϕ1 $ ϕ2)
svar_is_fresh_in Y ϕ1
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ϕ1 $ ϕ2)
HfrY: svar_is_fresh_in Y (ϕ1 $ ϕ2)
size ϕ2 ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ϕ1 $ ϕ2)
HfrY: svar_is_fresh_in Y (ϕ1 $ ϕ2)
svar_is_fresh_in X ϕ2
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ϕ1 $ ϕ2)
HfrY: svar_is_fresh_in Y (ϕ1 $ ϕ2)
svar_is_fresh_in Y ϕ2
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ϕ1 $ ϕ2)
HfrY: svar_is_fresh_in Y (ϕ1 $ ϕ2)
app_ext (eval (update_svar_val Y S ρ) ϕ1^{svar:dbi↦Y}) (eval (update_svar_val Y S ρ) ϕ2^{svar:dbi↦Y}) = app_ext (eval (update_svar_val Y S ρ) ((fix bsvar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => patt_bound_evar n | patt_bound_svar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_svar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_svar (Nat.pred n) end | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bsvar_subst psi x phi1 $ bsvar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bsvar_subst psi x phi1 ---> bsvar_subst psi x phi2 | ex , phi' => ex , bsvar_subst psi x phi' | mu , phi' => mu , bsvar_subst psi (Datatypes.S x) phi' end) (patt_free_svar Y) dbi ϕ1)) (eval (update_svar_val Y S ρ) ((fix bsvar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => patt_bound_evar n | patt_bound_svar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_svar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_svar (Nat.pred n) end | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bsvar_subst psi x phi1 $ bsvar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bsvar_subst psi x phi1 ---> bsvar_subst psi x phi2 | ex , phi' => ex , bsvar_subst psi x phi' | mu , phi' => mu , bsvar_subst psi (Datatypes.S x) phi' end) (patt_free_svar Y) dbi ϕ2))
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ϕ1 $ ϕ2)
HfrY: svar_is_fresh_in Y (ϕ1 $ ϕ2)

svar_is_fresh_in Y ϕ1
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ϕ1 $ ϕ2)
HfrY: svar_is_fresh_in Y (ϕ1 $ ϕ2)
size ϕ2 ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ϕ1 $ ϕ2)
HfrY: svar_is_fresh_in Y (ϕ1 $ ϕ2)
svar_is_fresh_in X ϕ2
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ϕ1 $ ϕ2)
HfrY: svar_is_fresh_in Y (ϕ1 $ ϕ2)
svar_is_fresh_in Y ϕ2
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ϕ1 $ ϕ2)
HfrY: svar_is_fresh_in Y (ϕ1 $ ϕ2)
app_ext (eval (update_svar_val Y S ρ) ϕ1^{svar:dbi↦Y}) (eval (update_svar_val Y S ρ) ϕ2^{svar:dbi↦Y}) = app_ext (eval (update_svar_val Y S ρ) ((fix bsvar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => patt_bound_evar n | patt_bound_svar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_svar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_svar (Nat.pred n) end | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bsvar_subst psi x phi1 $ bsvar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bsvar_subst psi x phi1 ---> bsvar_subst psi x phi2 | ex , phi' => ex , bsvar_subst psi x phi' | mu , phi' => mu , bsvar_subst psi (Datatypes.S x) phi' end) (patt_free_svar Y) dbi ϕ1)) (eval (update_svar_val Y S ρ) ((fix bsvar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => patt_bound_evar n | patt_bound_svar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_svar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_svar (Nat.pred n) end | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bsvar_subst psi x phi1 $ bsvar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bsvar_subst psi x phi1 ---> bsvar_subst psi x phi2 | ex , phi' => ex , bsvar_subst psi x phi' | mu , phi' => mu , bsvar_subst psi (Datatypes.S x) phi' end) (patt_free_svar Y) dbi ϕ2))
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ϕ1 $ ϕ2)
HfrY: svar_is_fresh_in Y (ϕ1 $ ϕ2)

svar_is_fresh_in Y (ϕ1 $ ?ϕ₂)
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ϕ1 $ ϕ2)
HfrY: svar_is_fresh_in Y (ϕ1 $ ϕ2)
size ϕ2 ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ϕ1 $ ϕ2)
HfrY: svar_is_fresh_in Y (ϕ1 $ ϕ2)
svar_is_fresh_in X ϕ2
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ϕ1 $ ϕ2)
HfrY: svar_is_fresh_in Y (ϕ1 $ ϕ2)
svar_is_fresh_in Y ϕ2
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ϕ1 $ ϕ2)
HfrY: svar_is_fresh_in Y (ϕ1 $ ϕ2)
app_ext (eval (update_svar_val Y S ρ) ϕ1^{svar:dbi↦Y}) (eval (update_svar_val Y S ρ) ϕ2^{svar:dbi↦Y}) = app_ext (eval (update_svar_val Y S ρ) ((fix bsvar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => patt_bound_evar n | patt_bound_svar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_svar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_svar (Nat.pred n) end | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bsvar_subst psi x phi1 $ bsvar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bsvar_subst psi x phi1 ---> bsvar_subst psi x phi2 | ex , phi' => ex , bsvar_subst psi x phi' | mu , phi' => mu , bsvar_subst psi (Datatypes.S x) phi' end) (patt_free_svar Y) dbi ϕ1)) (eval (update_svar_val Y S ρ) ((fix bsvar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => patt_bound_evar n | patt_bound_svar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_svar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_svar (Nat.pred n) end | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bsvar_subst psi x phi1 $ bsvar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bsvar_subst psi x phi1 ---> bsvar_subst psi x phi2 | ex , phi' => ex , bsvar_subst psi x phi' | mu , phi' => mu , bsvar_subst psi (Datatypes.S x) phi' end) (patt_free_svar Y) dbi ϕ2))
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ϕ1 $ ϕ2)
HfrY: svar_is_fresh_in Y (ϕ1 $ ϕ2)

size ϕ2 ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ϕ1 $ ϕ2)
HfrY: svar_is_fresh_in Y (ϕ1 $ ϕ2)
svar_is_fresh_in X ϕ2
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ϕ1 $ ϕ2)
HfrY: svar_is_fresh_in Y (ϕ1 $ ϕ2)
svar_is_fresh_in Y ϕ2
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ϕ1 $ ϕ2)
HfrY: svar_is_fresh_in Y (ϕ1 $ ϕ2)
app_ext (eval (update_svar_val Y S ρ) ϕ1^{svar:dbi↦Y}) (eval (update_svar_val Y S ρ) ϕ2^{svar:dbi↦Y}) = app_ext (eval (update_svar_val Y S ρ) ((fix bsvar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => patt_bound_evar n | patt_bound_svar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_svar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_svar (Nat.pred n) end | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bsvar_subst psi x phi1 $ bsvar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bsvar_subst psi x phi1 ---> bsvar_subst psi x phi2 | ex , phi' => ex , bsvar_subst psi x phi' | mu , phi' => mu , bsvar_subst psi (Datatypes.S x) phi' end) (patt_free_svar Y) dbi ϕ1)) (eval (update_svar_val Y S ρ) ((fix bsvar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => patt_bound_evar n | patt_bound_svar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_svar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_svar (Nat.pred n) end | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bsvar_subst psi x phi1 $ bsvar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bsvar_subst psi x phi1 ---> bsvar_subst psi x phi2 | ex , phi' => ex , bsvar_subst psi x phi' | mu , phi' => mu , bsvar_subst psi (Datatypes.S x) phi' end) (patt_free_svar Y) dbi ϕ2))
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ϕ1 $ ϕ2)
HfrY: svar_is_fresh_in Y (ϕ1 $ ϕ2)

svar_is_fresh_in X ϕ2
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ϕ1 $ ϕ2)
HfrY: svar_is_fresh_in Y (ϕ1 $ ϕ2)
svar_is_fresh_in Y ϕ2
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ϕ1 $ ϕ2)
HfrY: svar_is_fresh_in Y (ϕ1 $ ϕ2)
app_ext (eval (update_svar_val Y S ρ) ϕ1^{svar:dbi↦Y}) (eval (update_svar_val Y S ρ) ϕ2^{svar:dbi↦Y}) = app_ext (eval (update_svar_val Y S ρ) ((fix bsvar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => patt_bound_evar n | patt_bound_svar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_svar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_svar (Nat.pred n) end | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bsvar_subst psi x phi1 $ bsvar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bsvar_subst psi x phi1 ---> bsvar_subst psi x phi2 | ex , phi' => ex , bsvar_subst psi x phi' | mu , phi' => mu , bsvar_subst psi (Datatypes.S x) phi' end) (patt_free_svar Y) dbi ϕ1)) (eval (update_svar_val Y S ρ) ((fix bsvar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => patt_bound_evar n | patt_bound_svar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_svar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_svar (Nat.pred n) end | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bsvar_subst psi x phi1 $ bsvar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bsvar_subst psi x phi1 ---> bsvar_subst psi x phi2 | ex , phi' => ex , bsvar_subst psi x phi' | mu , phi' => mu , bsvar_subst psi (Datatypes.S x) phi' end) (patt_free_svar Y) dbi ϕ2))
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ϕ1 $ ϕ2)
HfrY: svar_is_fresh_in Y (ϕ1 $ ϕ2)

svar_is_fresh_in X (?ϕ₁ $ ϕ2)
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ϕ1 $ ϕ2)
HfrY: svar_is_fresh_in Y (ϕ1 $ ϕ2)
svar_is_fresh_in Y ϕ2
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ϕ1 $ ϕ2)
HfrY: svar_is_fresh_in Y (ϕ1 $ ϕ2)
app_ext (eval (update_svar_val Y S ρ) ϕ1^{svar:dbi↦Y}) (eval (update_svar_val Y S ρ) ϕ2^{svar:dbi↦Y}) = app_ext (eval (update_svar_val Y S ρ) ((fix bsvar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => patt_bound_evar n | patt_bound_svar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_svar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_svar (Nat.pred n) end | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bsvar_subst psi x phi1 $ bsvar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bsvar_subst psi x phi1 ---> bsvar_subst psi x phi2 | ex , phi' => ex , bsvar_subst psi x phi' | mu , phi' => mu , bsvar_subst psi (Datatypes.S x) phi' end) (patt_free_svar Y) dbi ϕ1)) (eval (update_svar_val Y S ρ) ((fix bsvar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => patt_bound_evar n | patt_bound_svar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_svar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_svar (Nat.pred n) end | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bsvar_subst psi x phi1 $ bsvar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bsvar_subst psi x phi1 ---> bsvar_subst psi x phi2 | ex , phi' => ex , bsvar_subst psi x phi' | mu , phi' => mu , bsvar_subst psi (Datatypes.S x) phi' end) (patt_free_svar Y) dbi ϕ2))
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ϕ1 $ ϕ2)
HfrY: svar_is_fresh_in Y (ϕ1 $ ϕ2)

svar_is_fresh_in Y ϕ2
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ϕ1 $ ϕ2)
HfrY: svar_is_fresh_in Y (ϕ1 $ ϕ2)
app_ext (eval (update_svar_val Y S ρ) ϕ1^{svar:dbi↦Y}) (eval (update_svar_val Y S ρ) ϕ2^{svar:dbi↦Y}) = app_ext (eval (update_svar_val Y S ρ) ((fix bsvar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => patt_bound_evar n | patt_bound_svar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_svar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_svar (Nat.pred n) end | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bsvar_subst psi x phi1 $ bsvar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bsvar_subst psi x phi1 ---> bsvar_subst psi x phi2 | ex , phi' => ex , bsvar_subst psi x phi' | mu , phi' => mu , bsvar_subst psi (Datatypes.S x) phi' end) (patt_free_svar Y) dbi ϕ1)) (eval (update_svar_val Y S ρ) ((fix bsvar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => patt_bound_evar n | patt_bound_svar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_svar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_svar (Nat.pred n) end | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bsvar_subst psi x phi1 $ bsvar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bsvar_subst psi x phi1 ---> bsvar_subst psi x phi2 | ex , phi' => ex , bsvar_subst psi x phi' | mu , phi' => mu , bsvar_subst psi (Datatypes.S x) phi' end) (patt_free_svar Y) dbi ϕ2))
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ϕ1 $ ϕ2)
HfrY: svar_is_fresh_in Y (ϕ1 $ ϕ2)

svar_is_fresh_in Y (?ϕ₁ $ ϕ2)
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ϕ1 $ ϕ2)
HfrY: svar_is_fresh_in Y (ϕ1 $ ϕ2)
app_ext (eval (update_svar_val Y S ρ) ϕ1^{svar:dbi↦Y}) (eval (update_svar_val Y S ρ) ϕ2^{svar:dbi↦Y}) = app_ext (eval (update_svar_val Y S ρ) ((fix bsvar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => patt_bound_evar n | patt_bound_svar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_svar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_svar (Nat.pred n) end | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bsvar_subst psi x phi1 $ bsvar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bsvar_subst psi x phi1 ---> bsvar_subst psi x phi2 | ex , phi' => ex , bsvar_subst psi x phi' | mu , phi' => mu , bsvar_subst psi (Datatypes.S x) phi' end) (patt_free_svar Y) dbi ϕ1)) (eval (update_svar_val Y S ρ) ((fix bsvar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => patt_bound_evar n | patt_bound_svar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_svar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_svar (Nat.pred n) end | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bsvar_subst psi x phi1 $ bsvar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bsvar_subst psi x phi1 ---> bsvar_subst psi x phi2 | ex , phi' => ex , bsvar_subst psi x phi' | mu , phi' => mu , bsvar_subst psi (Datatypes.S x) phi' end) (patt_free_svar Y) dbi ϕ2))
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ϕ1 $ ϕ2)
HfrY: svar_is_fresh_in Y (ϕ1 $ ϕ2)

app_ext (eval (update_svar_val Y S ρ) ϕ1^{svar:dbi↦Y}) (eval (update_svar_val Y S ρ) ϕ2^{svar:dbi↦Y}) = app_ext (eval (update_svar_val Y S ρ) ((fix bsvar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => patt_bound_evar n | patt_bound_svar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_svar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_svar (Nat.pred n) end | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bsvar_subst psi x phi1 $ bsvar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bsvar_subst psi x phi1 ---> bsvar_subst psi x phi2 | ex , phi' => ex , bsvar_subst psi x phi' | mu , phi' => mu , bsvar_subst psi (Datatypes.S x) phi' end) (patt_free_svar Y) dbi ϕ1)) (eval (update_svar_val Y S ρ) ((fix bsvar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => patt_bound_evar n | patt_bound_svar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_svar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_svar (Nat.pred n) end | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bsvar_subst psi x phi1 $ bsvar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bsvar_subst psi x phi1 ---> bsvar_subst psi x phi2 | ex , phi' => ex , bsvar_subst psi x phi' | mu , phi' => mu , bsvar_subst psi (Datatypes.S x) phi' end) (patt_free_svar Y) dbi ϕ2))
reflexivity.
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
dbi: db_index
ρ: Valuation
Hsz: 0 ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X ⊥
HfrY: svar_is_fresh_in Y ⊥

eval (update_svar_val X S ρ) ⊥^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ⊥^{svar:dbi↦Y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
dbi: db_index
ρ: Valuation
Hsz: 0 ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X ⊥
HfrY: svar_is_fresh_in Y ⊥

size ⊥ ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
dbi: db_index
ρ: Valuation
Hsz: 0 ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X ⊥
HfrY: svar_is_fresh_in Y ⊥
svar_is_fresh_in X ⊥
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
dbi: db_index
ρ: Valuation
Hsz: 0 ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X ⊥
HfrY: svar_is_fresh_in Y ⊥
svar_is_fresh_in Y ⊥
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
dbi: db_index
ρ: Valuation
Hsz: 0 ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X ⊥
HfrY: svar_is_fresh_in Y ⊥
eval (update_svar_val Y S ρ) ⊥^{svar:dbi↦Y} = eval (update_svar_val Y S ρ) ⊥^{svar:dbi↦Y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
dbi: db_index
ρ: Valuation
Hsz: 0 ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X ⊥
HfrY: svar_is_fresh_in Y ⊥

size ⊥ ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
dbi: db_index
ρ: Valuation
Hsz: 0 ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X ⊥
HfrY: svar_is_fresh_in Y ⊥
svar_is_fresh_in X ⊥
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
dbi: db_index
ρ: Valuation
Hsz: 0 ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X ⊥
HfrY: svar_is_fresh_in Y ⊥
svar_is_fresh_in Y ⊥
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
dbi: db_index
ρ: Valuation
Hsz: 0 ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X ⊥
HfrY: svar_is_fresh_in Y ⊥

size ⊥ ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
dbi: db_index
ρ: Valuation
Hsz: 0 ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X ⊥
HfrY: svar_is_fresh_in Y ⊥

0 ≤ sz
lia.
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ϕ1 ---> ϕ2)
HfrY: svar_is_fresh_in Y (ϕ1 ---> ϕ2)

eval (update_svar_val X S ρ) (ϕ1 ---> ϕ2)^{svar:dbi↦X} = eval (update_svar_val Y S ρ) (ϕ1 ---> ϕ2)^{svar:dbi↦Y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ϕ1 ---> ϕ2)
HfrY: svar_is_fresh_in Y (ϕ1 ---> ϕ2)

⊤ ∖ eval (update_svar_val X S ρ) ((fix bsvar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => patt_bound_evar n | patt_bound_svar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_svar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_svar (Nat.pred n) end | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bsvar_subst psi x phi1 $ bsvar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bsvar_subst psi x phi1 ---> bsvar_subst psi x phi2 | ex , phi' => ex , bsvar_subst psi x phi' | mu , phi' => mu , bsvar_subst psi (Datatypes.S x) phi' end) (patt_free_svar X) dbi ϕ1) ∪ eval (update_svar_val X S ρ) ((fix bsvar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => patt_bound_evar n | patt_bound_svar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_svar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_svar (Nat.pred n) end | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bsvar_subst psi x phi1 $ bsvar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bsvar_subst psi x phi1 ---> bsvar_subst psi x phi2 | ex , phi' => ex , bsvar_subst psi x phi' | mu , phi' => mu , bsvar_subst psi (Datatypes.S x) phi' end) (patt_free_svar X) dbi ϕ2) = ⊤ ∖ eval (update_svar_val Y S ρ) ((fix bsvar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => patt_bound_evar n | patt_bound_svar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_svar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_svar (Nat.pred n) end | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bsvar_subst psi x phi1 $ bsvar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bsvar_subst psi x phi1 ---> bsvar_subst psi x phi2 | ex , phi' => ex , bsvar_subst psi x phi' | mu , phi' => mu , bsvar_subst psi (Datatypes.S x) phi' end) (patt_free_svar Y) dbi ϕ1) ∪ eval (update_svar_val Y S ρ) ((fix bsvar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => patt_bound_evar n | patt_bound_svar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_svar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_svar (Nat.pred n) end | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bsvar_subst psi x phi1 $ bsvar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bsvar_subst psi x phi1 ---> bsvar_subst psi x phi2 | ex , phi' => ex , bsvar_subst psi x phi' | mu , phi' => mu , bsvar_subst psi (Datatypes.S x) phi' end) (patt_free_svar Y) dbi ϕ2)
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ϕ1 ---> ϕ2)
HfrY: svar_is_fresh_in Y (ϕ1 ---> ϕ2)

⊤ ∖ eval (update_svar_val X S ρ) ((fix bsvar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => patt_bound_evar n | patt_bound_svar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_svar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_svar (Nat.pred n) end | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bsvar_subst psi x phi1 $ bsvar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bsvar_subst psi x phi1 ---> bsvar_subst psi x phi2 | ex , phi' => ex , bsvar_subst psi x phi' | mu , phi' => mu , bsvar_subst psi (Datatypes.S x) phi' end) (patt_free_svar X) dbi ϕ1) ∪ eval (update_svar_val X S ρ) ((fix bsvar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => patt_bound_evar n | patt_bound_svar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_svar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_svar (Nat.pred n) end | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bsvar_subst psi x phi1 $ bsvar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bsvar_subst psi x phi1 ---> bsvar_subst psi x phi2 | ex , phi' => ex , bsvar_subst psi x phi' | mu , phi' => mu , bsvar_subst psi (Datatypes.S x) phi' end) (patt_free_svar X) dbi ϕ2) = ⊤ ∖ eval (update_svar_val Y S ρ) ((fix bsvar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => patt_bound_evar n | patt_bound_svar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_svar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_svar (Nat.pred n) end | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bsvar_subst psi x phi1 $ bsvar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bsvar_subst psi x phi1 ---> bsvar_subst psi x phi2 | ex , phi' => ex , bsvar_subst psi x phi' | mu , phi' => mu , bsvar_subst psi (Datatypes.S x) phi' end) (patt_free_svar Y) dbi ϕ1) ∪ eval (update_svar_val Y S ρ) ((fix bsvar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => patt_bound_evar n | patt_bound_svar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_svar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_svar (Nat.pred n) end | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bsvar_subst psi x phi1 $ bsvar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bsvar_subst psi x phi1 ---> bsvar_subst psi x phi2 | ex , phi' => ex , bsvar_subst psi x phi' | mu , phi' => mu , bsvar_subst psi (Datatypes.S x) phi' end) (patt_free_svar Y) dbi ϕ2)
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ϕ1 ---> ϕ2)
HfrY: svar_is_fresh_in Y (ϕ1 ---> ϕ2)

size ϕ1 ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ϕ1 ---> ϕ2)
HfrY: svar_is_fresh_in Y (ϕ1 ---> ϕ2)
svar_is_fresh_in X ϕ1
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ϕ1 ---> ϕ2)
HfrY: svar_is_fresh_in Y (ϕ1 ---> ϕ2)
svar_is_fresh_in Y ϕ1
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ϕ1 ---> ϕ2)
HfrY: svar_is_fresh_in Y (ϕ1 ---> ϕ2)
⊤ ∖ eval (update_svar_val Y S ρ) ϕ1^{svar:dbi↦Y} ∪ eval (update_svar_val X S ρ) ((fix bsvar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => patt_bound_evar n | patt_bound_svar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_svar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_svar (Nat.pred n) end | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bsvar_subst psi x phi1 $ bsvar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bsvar_subst psi x phi1 ---> bsvar_subst psi x phi2 | ex , phi' => ex , bsvar_subst psi x phi' | mu , phi' => mu , bsvar_subst psi (Datatypes.S x) phi' end) (patt_free_svar X) dbi ϕ2) = ⊤ ∖ eval (update_svar_val Y S ρ) ((fix bsvar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => patt_bound_evar n | patt_bound_svar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_svar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_svar (Nat.pred n) end | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bsvar_subst psi x phi1 $ bsvar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bsvar_subst psi x phi1 ---> bsvar_subst psi x phi2 | ex , phi' => ex , bsvar_subst psi x phi' | mu , phi' => mu , bsvar_subst psi (Datatypes.S x) phi' end) (patt_free_svar Y) dbi ϕ1) ∪ eval (update_svar_val Y S ρ) ((fix bsvar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => patt_bound_evar n | patt_bound_svar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_svar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_svar (Nat.pred n) end | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bsvar_subst psi x phi1 $ bsvar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bsvar_subst psi x phi1 ---> bsvar_subst psi x phi2 | ex , phi' => ex , bsvar_subst psi x phi' | mu , phi' => mu , bsvar_subst psi (Datatypes.S x) phi' end) (patt_free_svar Y) dbi ϕ2)
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ϕ1 ---> ϕ2)
HfrY: svar_is_fresh_in Y (ϕ1 ---> ϕ2)

size ϕ1 ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ϕ1 ---> ϕ2)
HfrY: svar_is_fresh_in Y (ϕ1 ---> ϕ2)
svar_is_fresh_in X ϕ1
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ϕ1 ---> ϕ2)
HfrY: svar_is_fresh_in Y (ϕ1 ---> ϕ2)
svar_is_fresh_in Y ϕ1
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ϕ1 ---> ϕ2)
HfrY: svar_is_fresh_in Y (ϕ1 ---> ϕ2)
size ϕ2 ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ϕ1 ---> ϕ2)
HfrY: svar_is_fresh_in Y (ϕ1 ---> ϕ2)
svar_is_fresh_in X ϕ2
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ϕ1 ---> ϕ2)
HfrY: svar_is_fresh_in Y (ϕ1 ---> ϕ2)
svar_is_fresh_in Y ϕ2
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ϕ1 ---> ϕ2)
HfrY: svar_is_fresh_in Y (ϕ1 ---> ϕ2)
⊤ ∖ eval (update_svar_val Y S ρ) ϕ1^{svar:dbi↦Y} ∪ eval (update_svar_val Y S ρ) ϕ2^{svar:dbi↦Y} = ⊤ ∖ eval (update_svar_val Y S ρ) ((fix bsvar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => patt_bound_evar n | patt_bound_svar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_svar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_svar (Nat.pred n) end | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bsvar_subst psi x phi1 $ bsvar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bsvar_subst psi x phi1 ---> bsvar_subst psi x phi2 | ex , phi' => ex , bsvar_subst psi x phi' | mu , phi' => mu , bsvar_subst psi (Datatypes.S x) phi' end) (patt_free_svar Y) dbi ϕ1) ∪ eval (update_svar_val Y S ρ) ((fix bsvar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => patt_bound_evar n | patt_bound_svar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_svar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_svar (Nat.pred n) end | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bsvar_subst psi x phi1 $ bsvar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bsvar_subst psi x phi1 ---> bsvar_subst psi x phi2 | ex , phi' => ex , bsvar_subst psi x phi' | mu , phi' => mu , bsvar_subst psi (Datatypes.S x) phi' end) (patt_free_svar Y) dbi ϕ2)
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ϕ1 ---> ϕ2)
HfrY: svar_is_fresh_in Y (ϕ1 ---> ϕ2)

svar_is_fresh_in X ϕ1
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ϕ1 ---> ϕ2)
HfrY: svar_is_fresh_in Y (ϕ1 ---> ϕ2)
svar_is_fresh_in Y ϕ1
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ϕ1 ---> ϕ2)
HfrY: svar_is_fresh_in Y (ϕ1 ---> ϕ2)
size ϕ2 ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ϕ1 ---> ϕ2)
HfrY: svar_is_fresh_in Y (ϕ1 ---> ϕ2)
svar_is_fresh_in X ϕ2
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ϕ1 ---> ϕ2)
HfrY: svar_is_fresh_in Y (ϕ1 ---> ϕ2)
svar_is_fresh_in Y ϕ2
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ϕ1 ---> ϕ2)
HfrY: svar_is_fresh_in Y (ϕ1 ---> ϕ2)
⊤ ∖ eval (update_svar_val Y S ρ) ϕ1^{svar:dbi↦Y} ∪ eval (update_svar_val Y S ρ) ϕ2^{svar:dbi↦Y} = ⊤ ∖ eval (update_svar_val Y S ρ) ((fix bsvar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => patt_bound_evar n | patt_bound_svar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_svar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_svar (Nat.pred n) end | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bsvar_subst psi x phi1 $ bsvar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bsvar_subst psi x phi1 ---> bsvar_subst psi x phi2 | ex , phi' => ex , bsvar_subst psi x phi' | mu , phi' => mu , bsvar_subst psi (Datatypes.S x) phi' end) (patt_free_svar Y) dbi ϕ1) ∪ eval (update_svar_val Y S ρ) ((fix bsvar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => patt_bound_evar n | patt_bound_svar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_svar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_svar (Nat.pred n) end | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bsvar_subst psi x phi1 $ bsvar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bsvar_subst psi x phi1 ---> bsvar_subst psi x phi2 | ex , phi' => ex , bsvar_subst psi x phi' | mu , phi' => mu , bsvar_subst psi (Datatypes.S x) phi' end) (patt_free_svar Y) dbi ϕ2)
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ϕ1 ---> ϕ2)
HfrY: svar_is_fresh_in Y (ϕ1 ---> ϕ2)

svar_is_fresh_in X (ϕ1 $ ?ϕ₂)
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ϕ1 ---> ϕ2)
HfrY: svar_is_fresh_in Y (ϕ1 ---> ϕ2)
svar_is_fresh_in Y ϕ1
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ϕ1 ---> ϕ2)
HfrY: svar_is_fresh_in Y (ϕ1 ---> ϕ2)
size ϕ2 ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ϕ1 ---> ϕ2)
HfrY: svar_is_fresh_in Y (ϕ1 ---> ϕ2)
svar_is_fresh_in X ϕ2
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ϕ1 ---> ϕ2)
HfrY: svar_is_fresh_in Y (ϕ1 ---> ϕ2)
svar_is_fresh_in Y ϕ2
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ϕ1 ---> ϕ2)
HfrY: svar_is_fresh_in Y (ϕ1 ---> ϕ2)
⊤ ∖ eval (update_svar_val Y S ρ) ϕ1^{svar:dbi↦Y} ∪ eval (update_svar_val Y S ρ) ϕ2^{svar:dbi↦Y} = ⊤ ∖ eval (update_svar_val Y S ρ) ((fix bsvar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => patt_bound_evar n | patt_bound_svar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_svar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_svar (Nat.pred n) end | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bsvar_subst psi x phi1 $ bsvar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bsvar_subst psi x phi1 ---> bsvar_subst psi x phi2 | ex , phi' => ex , bsvar_subst psi x phi' | mu , phi' => mu , bsvar_subst psi (Datatypes.S x) phi' end) (patt_free_svar Y) dbi ϕ1) ∪ eval (update_svar_val Y S ρ) ((fix bsvar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => patt_bound_evar n | patt_bound_svar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_svar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_svar (Nat.pred n) end | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bsvar_subst psi x phi1 $ bsvar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bsvar_subst psi x phi1 ---> bsvar_subst psi x phi2 | ex , phi' => ex , bsvar_subst psi x phi' | mu , phi' => mu , bsvar_subst psi (Datatypes.S x) phi' end) (patt_free_svar Y) dbi ϕ2)
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ϕ1 ---> ϕ2)
HfrY: svar_is_fresh_in Y (ϕ1 ---> ϕ2)

svar_is_fresh_in Y ϕ1
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ϕ1 ---> ϕ2)
HfrY: svar_is_fresh_in Y (ϕ1 ---> ϕ2)
size ϕ2 ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ϕ1 ---> ϕ2)
HfrY: svar_is_fresh_in Y (ϕ1 ---> ϕ2)
svar_is_fresh_in X ϕ2
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ϕ1 ---> ϕ2)
HfrY: svar_is_fresh_in Y (ϕ1 ---> ϕ2)
svar_is_fresh_in Y ϕ2
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ϕ1 ---> ϕ2)
HfrY: svar_is_fresh_in Y (ϕ1 ---> ϕ2)
⊤ ∖ eval (update_svar_val Y S ρ) ϕ1^{svar:dbi↦Y} ∪ eval (update_svar_val Y S ρ) ϕ2^{svar:dbi↦Y} = ⊤ ∖ eval (update_svar_val Y S ρ) ((fix bsvar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => patt_bound_evar n | patt_bound_svar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_svar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_svar (Nat.pred n) end | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bsvar_subst psi x phi1 $ bsvar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bsvar_subst psi x phi1 ---> bsvar_subst psi x phi2 | ex , phi' => ex , bsvar_subst psi x phi' | mu , phi' => mu , bsvar_subst psi (Datatypes.S x) phi' end) (patt_free_svar Y) dbi ϕ1) ∪ eval (update_svar_val Y S ρ) ((fix bsvar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => patt_bound_evar n | patt_bound_svar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_svar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_svar (Nat.pred n) end | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bsvar_subst psi x phi1 $ bsvar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bsvar_subst psi x phi1 ---> bsvar_subst psi x phi2 | ex , phi' => ex , bsvar_subst psi x phi' | mu , phi' => mu , bsvar_subst psi (Datatypes.S x) phi' end) (patt_free_svar Y) dbi ϕ2)
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ϕ1 ---> ϕ2)
HfrY: svar_is_fresh_in Y (ϕ1 ---> ϕ2)

svar_is_fresh_in Y (ϕ1 $ ?ϕ₂)
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ϕ1 ---> ϕ2)
HfrY: svar_is_fresh_in Y (ϕ1 ---> ϕ2)
size ϕ2 ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ϕ1 ---> ϕ2)
HfrY: svar_is_fresh_in Y (ϕ1 ---> ϕ2)
svar_is_fresh_in X ϕ2
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ϕ1 ---> ϕ2)
HfrY: svar_is_fresh_in Y (ϕ1 ---> ϕ2)
svar_is_fresh_in Y ϕ2
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ϕ1 ---> ϕ2)
HfrY: svar_is_fresh_in Y (ϕ1 ---> ϕ2)
⊤ ∖ eval (update_svar_val Y S ρ) ϕ1^{svar:dbi↦Y} ∪ eval (update_svar_val Y S ρ) ϕ2^{svar:dbi↦Y} = ⊤ ∖ eval (update_svar_val Y S ρ) ((fix bsvar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => patt_bound_evar n | patt_bound_svar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_svar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_svar (Nat.pred n) end | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bsvar_subst psi x phi1 $ bsvar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bsvar_subst psi x phi1 ---> bsvar_subst psi x phi2 | ex , phi' => ex , bsvar_subst psi x phi' | mu , phi' => mu , bsvar_subst psi (Datatypes.S x) phi' end) (patt_free_svar Y) dbi ϕ1) ∪ eval (update_svar_val Y S ρ) ((fix bsvar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => patt_bound_evar n | patt_bound_svar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_svar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_svar (Nat.pred n) end | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bsvar_subst psi x phi1 $ bsvar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bsvar_subst psi x phi1 ---> bsvar_subst psi x phi2 | ex , phi' => ex , bsvar_subst psi x phi' | mu , phi' => mu , bsvar_subst psi (Datatypes.S x) phi' end) (patt_free_svar Y) dbi ϕ2)
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ϕ1 ---> ϕ2)
HfrY: svar_is_fresh_in Y (ϕ1 ---> ϕ2)

size ϕ2 ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ϕ1 ---> ϕ2)
HfrY: svar_is_fresh_in Y (ϕ1 ---> ϕ2)
svar_is_fresh_in X ϕ2
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ϕ1 ---> ϕ2)
HfrY: svar_is_fresh_in Y (ϕ1 ---> ϕ2)
svar_is_fresh_in Y ϕ2
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ϕ1 ---> ϕ2)
HfrY: svar_is_fresh_in Y (ϕ1 ---> ϕ2)
⊤ ∖ eval (update_svar_val Y S ρ) ϕ1^{svar:dbi↦Y} ∪ eval (update_svar_val Y S ρ) ϕ2^{svar:dbi↦Y} = ⊤ ∖ eval (update_svar_val Y S ρ) ((fix bsvar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => patt_bound_evar n | patt_bound_svar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_svar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_svar (Nat.pred n) end | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bsvar_subst psi x phi1 $ bsvar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bsvar_subst psi x phi1 ---> bsvar_subst psi x phi2 | ex , phi' => ex , bsvar_subst psi x phi' | mu , phi' => mu , bsvar_subst psi (Datatypes.S x) phi' end) (patt_free_svar Y) dbi ϕ1) ∪ eval (update_svar_val Y S ρ) ((fix bsvar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => patt_bound_evar n | patt_bound_svar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_svar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_svar (Nat.pred n) end | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bsvar_subst psi x phi1 $ bsvar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bsvar_subst psi x phi1 ---> bsvar_subst psi x phi2 | ex , phi' => ex , bsvar_subst psi x phi' | mu , phi' => mu , bsvar_subst psi (Datatypes.S x) phi' end) (patt_free_svar Y) dbi ϕ2)
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ϕ1 ---> ϕ2)
HfrY: svar_is_fresh_in Y (ϕ1 ---> ϕ2)

svar_is_fresh_in X ϕ2
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ϕ1 ---> ϕ2)
HfrY: svar_is_fresh_in Y (ϕ1 ---> ϕ2)
svar_is_fresh_in Y ϕ2
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ϕ1 ---> ϕ2)
HfrY: svar_is_fresh_in Y (ϕ1 ---> ϕ2)
⊤ ∖ eval (update_svar_val Y S ρ) ϕ1^{svar:dbi↦Y} ∪ eval (update_svar_val Y S ρ) ϕ2^{svar:dbi↦Y} = ⊤ ∖ eval (update_svar_val Y S ρ) ((fix bsvar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => patt_bound_evar n | patt_bound_svar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_svar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_svar (Nat.pred n) end | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bsvar_subst psi x phi1 $ bsvar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bsvar_subst psi x phi1 ---> bsvar_subst psi x phi2 | ex , phi' => ex , bsvar_subst psi x phi' | mu , phi' => mu , bsvar_subst psi (Datatypes.S x) phi' end) (patt_free_svar Y) dbi ϕ1) ∪ eval (update_svar_val Y S ρ) ((fix bsvar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => patt_bound_evar n | patt_bound_svar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_svar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_svar (Nat.pred n) end | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bsvar_subst psi x phi1 $ bsvar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bsvar_subst psi x phi1 ---> bsvar_subst psi x phi2 | ex , phi' => ex , bsvar_subst psi x phi' | mu , phi' => mu , bsvar_subst psi (Datatypes.S x) phi' end) (patt_free_svar Y) dbi ϕ2)
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ϕ1 ---> ϕ2)
HfrY: svar_is_fresh_in Y (ϕ1 ---> ϕ2)

svar_is_fresh_in X (?ϕ₁ $ ϕ2)
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ϕ1 ---> ϕ2)
HfrY: svar_is_fresh_in Y (ϕ1 ---> ϕ2)
svar_is_fresh_in Y ϕ2
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ϕ1 ---> ϕ2)
HfrY: svar_is_fresh_in Y (ϕ1 ---> ϕ2)
⊤ ∖ eval (update_svar_val Y S ρ) ϕ1^{svar:dbi↦Y} ∪ eval (update_svar_val Y S ρ) ϕ2^{svar:dbi↦Y} = ⊤ ∖ eval (update_svar_val Y S ρ) ((fix bsvar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => patt_bound_evar n | patt_bound_svar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_svar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_svar (Nat.pred n) end | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bsvar_subst psi x phi1 $ bsvar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bsvar_subst psi x phi1 ---> bsvar_subst psi x phi2 | ex , phi' => ex , bsvar_subst psi x phi' | mu , phi' => mu , bsvar_subst psi (Datatypes.S x) phi' end) (patt_free_svar Y) dbi ϕ1) ∪ eval (update_svar_val Y S ρ) ((fix bsvar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => patt_bound_evar n | patt_bound_svar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_svar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_svar (Nat.pred n) end | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bsvar_subst psi x phi1 $ bsvar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bsvar_subst psi x phi1 ---> bsvar_subst psi x phi2 | ex , phi' => ex , bsvar_subst psi x phi' | mu , phi' => mu , bsvar_subst psi (Datatypes.S x) phi' end) (patt_free_svar Y) dbi ϕ2)
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ϕ1 ---> ϕ2)
HfrY: svar_is_fresh_in Y (ϕ1 ---> ϕ2)

svar_is_fresh_in Y ϕ2
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ϕ1 ---> ϕ2)
HfrY: svar_is_fresh_in Y (ϕ1 ---> ϕ2)
⊤ ∖ eval (update_svar_val Y S ρ) ϕ1^{svar:dbi↦Y} ∪ eval (update_svar_val Y S ρ) ϕ2^{svar:dbi↦Y} = ⊤ ∖ eval (update_svar_val Y S ρ) ((fix bsvar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => patt_bound_evar n | patt_bound_svar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_svar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_svar (Nat.pred n) end | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bsvar_subst psi x phi1 $ bsvar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bsvar_subst psi x phi1 ---> bsvar_subst psi x phi2 | ex , phi' => ex , bsvar_subst psi x phi' | mu , phi' => mu , bsvar_subst psi (Datatypes.S x) phi' end) (patt_free_svar Y) dbi ϕ1) ∪ eval (update_svar_val Y S ρ) ((fix bsvar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => patt_bound_evar n | patt_bound_svar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_svar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_svar (Nat.pred n) end | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bsvar_subst psi x phi1 $ bsvar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bsvar_subst psi x phi1 ---> bsvar_subst psi x phi2 | ex , phi' => ex , bsvar_subst psi x phi' | mu , phi' => mu , bsvar_subst psi (Datatypes.S x) phi' end) (patt_free_svar Y) dbi ϕ2)
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ϕ1 ---> ϕ2)
HfrY: svar_is_fresh_in Y (ϕ1 ---> ϕ2)

svar_is_fresh_in Y (?ϕ₁ $ ϕ2)
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ϕ1 ---> ϕ2)
HfrY: svar_is_fresh_in Y (ϕ1 ---> ϕ2)
⊤ ∖ eval (update_svar_val Y S ρ) ϕ1^{svar:dbi↦Y} ∪ eval (update_svar_val Y S ρ) ϕ2^{svar:dbi↦Y} = ⊤ ∖ eval (update_svar_val Y S ρ) ((fix bsvar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => patt_bound_evar n | patt_bound_svar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_svar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_svar (Nat.pred n) end | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bsvar_subst psi x phi1 $ bsvar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bsvar_subst psi x phi1 ---> bsvar_subst psi x phi2 | ex , phi' => ex , bsvar_subst psi x phi' | mu , phi' => mu , bsvar_subst psi (Datatypes.S x) phi' end) (patt_free_svar Y) dbi ϕ1) ∪ eval (update_svar_val Y S ρ) ((fix bsvar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => patt_bound_evar n | patt_bound_svar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_svar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_svar (Nat.pred n) end | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bsvar_subst psi x phi1 $ bsvar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bsvar_subst psi x phi1 ---> bsvar_subst psi x phi2 | ex , phi' => ex , bsvar_subst psi x phi' | mu , phi' => mu , bsvar_subst psi (Datatypes.S x) phi' end) (patt_free_svar Y) dbi ϕ2)
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ1 + size ϕ2) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ϕ1 ---> ϕ2)
HfrY: svar_is_fresh_in Y (ϕ1 ---> ϕ2)

⊤ ∖ eval (update_svar_val Y S ρ) ϕ1^{svar:dbi↦Y} ∪ eval (update_svar_val Y S ρ) ϕ2^{svar:dbi↦Y} = ⊤ ∖ eval (update_svar_val Y S ρ) ((fix bsvar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => patt_bound_evar n | patt_bound_svar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_svar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_svar (Nat.pred n) end | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bsvar_subst psi x phi1 $ bsvar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bsvar_subst psi x phi1 ---> bsvar_subst psi x phi2 | ex , phi' => ex , bsvar_subst psi x phi' | mu , phi' => mu , bsvar_subst psi (Datatypes.S x) phi' end) (patt_free_svar Y) dbi ϕ1) ∪ eval (update_svar_val Y S ρ) ((fix bsvar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => patt_bound_evar n | patt_bound_svar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_svar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_svar (Nat.pred n) end | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bsvar_subst psi x phi1 $ bsvar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bsvar_subst psi x phi1 ---> bsvar_subst psi x phi2 | ex , phi' => ex , bsvar_subst psi x phi' | mu , phi' => mu , bsvar_subst psi (Datatypes.S x) phi' end) (patt_free_svar Y) dbi ϕ2)
reflexivity.
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ex , ϕ)
HfrY: svar_is_fresh_in Y (ex , ϕ)

eval (update_svar_val X S ρ) (ex , ϕ)^{svar:dbi↦X} = eval (update_svar_val Y S ρ) (ex , ϕ)^{svar:dbi↦Y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ex , ϕ)
HfrY: svar_is_fresh_in Y (ex , ϕ)

(let x := fresh_evar ((fix bsvar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => patt_bound_evar n | patt_bound_svar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_svar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_svar (Nat.pred n) end | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bsvar_subst psi x phi1 $ bsvar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bsvar_subst psi x phi1 ---> bsvar_subst psi x phi2 | ex , phi' => ex , bsvar_subst psi x phi' | mu , phi' => mu , bsvar_subst psi (Datatypes.S x) phi' end) (patt_free_svar X) dbi ϕ) in propset_fa_union (λ e : M, let ρ' := update_evar_val x e (update_svar_val X S ρ) in eval ρ' ((fix bsvar_subst (psi : Pattern) (x0 : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => patt_bound_evar n | patt_bound_svar n => match compare_nat n x0 with | Nat_less _ _ _ => patt_bound_svar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_svar (Nat.pred n) end | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bsvar_subst psi x0 phi1 $ bsvar_subst psi x0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bsvar_subst psi x0 phi1 ---> bsvar_subst psi x0 phi2 | ex , phi' => ex , bsvar_subst psi x0 phi' | mu , phi' => mu , bsvar_subst psi (Datatypes.S x0) phi' end) (patt_free_svar X) dbi ϕ)^{evar:0↦x})) = (let x := fresh_evar ((fix bsvar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => patt_bound_evar n | patt_bound_svar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_svar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_svar (Nat.pred n) end | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bsvar_subst psi x phi1 $ bsvar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bsvar_subst psi x phi1 ---> bsvar_subst psi x phi2 | ex , phi' => ex , bsvar_subst psi x phi' | mu , phi' => mu , bsvar_subst psi (Datatypes.S x) phi' end) (patt_free_svar Y) dbi ϕ) in propset_fa_union (λ e : M, let ρ' := update_evar_val x e (update_svar_val Y S ρ) in eval ρ' ((fix bsvar_subst (psi : Pattern) (x0 : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => patt_bound_evar n | patt_bound_svar n => match compare_nat n x0 with | Nat_less _ _ _ => patt_bound_svar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_svar (Nat.pred n) end | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bsvar_subst psi x0 phi1 $ bsvar_subst psi x0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bsvar_subst psi x0 phi1 ---> bsvar_subst psi x0 phi2 | ex , phi' => ex , bsvar_subst psi x0 phi' | mu , phi' => mu , bsvar_subst psi (Datatypes.S x0) phi' end) (patt_free_svar Y) dbi ϕ)^{evar:0↦x}))
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ex , ϕ)
HfrY: svar_is_fresh_in Y (ex , ϕ)

(let x := fresh_evar ((fix bsvar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => patt_bound_evar n | patt_bound_svar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_svar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_svar (Nat.pred n) end | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bsvar_subst psi x phi1 $ bsvar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bsvar_subst psi x phi1 ---> bsvar_subst psi x phi2 | ex , phi' => ex , bsvar_subst psi x phi' | mu , phi' => mu , bsvar_subst psi (Datatypes.S x) phi' end) (patt_free_svar X) dbi ϕ) in propset_fa_union (λ e : M, let ρ' := update_evar_val x e (update_svar_val X S ρ) in eval ρ' ((fix bsvar_subst (psi : Pattern) (x0 : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => patt_bound_evar n | patt_bound_svar n => match compare_nat n x0 with | Nat_less _ _ _ => patt_bound_svar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_svar (Nat.pred n) end | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bsvar_subst psi x0 phi1 $ bsvar_subst psi x0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bsvar_subst psi x0 phi1 ---> bsvar_subst psi x0 phi2 | ex , phi' => ex , bsvar_subst psi x0 phi' | mu , phi' => mu , bsvar_subst psi (Datatypes.S x0) phi' end) (patt_free_svar X) dbi ϕ)^{evar:0↦x})) = (let x := fresh_evar ((fix bsvar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => patt_bound_evar n | patt_bound_svar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_svar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_svar (Nat.pred n) end | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bsvar_subst psi x phi1 $ bsvar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bsvar_subst psi x phi1 ---> bsvar_subst psi x phi2 | ex , phi' => ex , bsvar_subst psi x phi' | mu , phi' => mu , bsvar_subst psi (Datatypes.S x) phi' end) (patt_free_svar Y) dbi ϕ) in propset_fa_union (λ e : M, let ρ' := update_evar_val x e (update_svar_val Y S ρ) in eval ρ' ((fix bsvar_subst (psi : Pattern) (x0 : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => patt_bound_evar n | patt_bound_svar n => match compare_nat n x0 with | Nat_less _ _ _ => patt_bound_svar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_svar (Nat.pred n) end | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bsvar_subst psi x0 phi1 $ bsvar_subst psi x0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bsvar_subst psi x0 phi1 ---> bsvar_subst psi x0 phi2 | ex , phi' => ex , bsvar_subst psi x0 phi' | mu , phi' => mu , bsvar_subst psi (Datatypes.S x0) phi' end) (patt_free_svar Y) dbi ϕ)^{evar:0↦x}))
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ex , ϕ)
HfrY: svar_is_fresh_in Y (ex , ϕ)

propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ((fix bsvar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => patt_bound_evar n | patt_bound_svar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_svar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_svar (Nat.pred n) end | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bsvar_subst psi x phi1 $ bsvar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bsvar_subst psi x phi1 ---> bsvar_subst psi x phi2 | ex , phi' => ex , bsvar_subst psi x phi' | mu , phi' => mu , bsvar_subst psi (Datatypes.S x) phi' end) (patt_free_svar X) dbi ϕ)) e (update_svar_val X S ρ)) ((fix bsvar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => patt_bound_evar n | patt_bound_svar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_svar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_svar (Nat.pred n) end | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bsvar_subst psi x phi1 $ bsvar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bsvar_subst psi x phi1 ---> bsvar_subst psi x phi2 | ex , phi' => ex , bsvar_subst psi x phi' | mu , phi' => mu , bsvar_subst psi (Datatypes.S x) phi' end) (patt_free_svar X) dbi ϕ)^{evar:0↦ fresh_evar ((fix bsvar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => patt_bound_evar n | patt_bound_svar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_svar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_svar (Nat.pred n) end | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bsvar_subst psi x phi1 $ bsvar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bsvar_subst psi x phi1 ---> bsvar_subst psi x phi2 | ex , phi' => ex , bsvar_subst psi x phi' | mu , phi' => mu , bsvar_subst psi (Datatypes.S x) phi' end) (patt_free_svar X) dbi ϕ)}) = propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ((fix bsvar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => patt_bound_evar n | patt_bound_svar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_svar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_svar (Nat.pred n) end | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bsvar_subst psi x phi1 $ bsvar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bsvar_subst psi x phi1 ---> bsvar_subst psi x phi2 | ex , phi' => ex , bsvar_subst psi x phi' | mu , phi' => mu , bsvar_subst psi (Datatypes.S x) phi' end) (patt_free_svar Y) dbi ϕ)) e (update_svar_val Y S ρ)) ((fix bsvar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => patt_bound_evar n | patt_bound_svar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_svar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_svar (Nat.pred n) end | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bsvar_subst psi x phi1 $ bsvar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bsvar_subst psi x phi1 ---> bsvar_subst psi x phi2 | ex , phi' => ex , bsvar_subst psi x phi' | mu , phi' => mu , bsvar_subst psi (Datatypes.S x) phi' end) (patt_free_svar Y) dbi ϕ)^{evar:0↦ fresh_evar ((fix bsvar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => patt_bound_evar n | patt_bound_svar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_svar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_svar (Nat.pred n) end | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bsvar_subst psi x phi1 $ bsvar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bsvar_subst psi x phi1 ---> bsvar_subst psi x phi2 | ex , phi' => ex , bsvar_subst psi x phi' | mu , phi' => mu , bsvar_subst psi (Datatypes.S x) phi' end) (patt_free_svar Y) dbi ϕ)})
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ex , ϕ)
HfrY: svar_is_fresh_in Y (ex , ϕ)

(λ e : M, eval (update_evar_val (fresh_evar ((fix bsvar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => patt_bound_evar n | patt_bound_svar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_svar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_svar (Nat.pred n) end | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bsvar_subst psi x phi1 $ bsvar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bsvar_subst psi x phi1 ---> bsvar_subst psi x phi2 | ex , phi' => ex , bsvar_subst psi x phi' | mu , phi' => mu , bsvar_subst psi (Datatypes.S x) phi' end) (patt_free_svar X) dbi ϕ)) e (update_svar_val X S ρ)) ((fix bsvar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => patt_bound_evar n | patt_bound_svar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_svar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_svar (Nat.pred n) end | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bsvar_subst psi x phi1 $ bsvar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bsvar_subst psi x phi1 ---> bsvar_subst psi x phi2 | ex , phi' => ex , bsvar_subst psi x phi' | mu , phi' => mu , bsvar_subst psi (Datatypes.S x) phi' end) (patt_free_svar X) dbi ϕ)^{evar:0↦fresh_evar ((fix bsvar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => patt_bound_evar n | patt_bound_svar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_svar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_svar (Nat.pred n) end | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bsvar_subst psi x phi1 $ bsvar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bsvar_subst psi x phi1 ---> bsvar_subst psi x phi2 | ex , phi' => ex , bsvar_subst psi x phi' | mu , phi' => mu , bsvar_subst psi (Datatypes.S x) phi' end) (patt_free_svar X) dbi ϕ)}) = (λ e : M, eval (update_evar_val (fresh_evar ((fix bsvar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => patt_bound_evar n | patt_bound_svar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_svar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_svar (Nat.pred n) end | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bsvar_subst psi x phi1 $ bsvar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bsvar_subst psi x phi1 ---> bsvar_subst psi x phi2 | ex , phi' => ex , bsvar_subst psi x phi' | mu , phi' => mu , bsvar_subst psi (Datatypes.S x) phi' end) (patt_free_svar Y) dbi ϕ)) e (update_svar_val Y S ρ)) ((fix bsvar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => patt_bound_evar n | patt_bound_svar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_svar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_svar (Nat.pred n) end | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bsvar_subst psi x phi1 $ bsvar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bsvar_subst psi x phi1 ---> bsvar_subst psi x phi2 | ex , phi' => ex , bsvar_subst psi x phi' | mu , phi' => mu , bsvar_subst psi (Datatypes.S x) phi' end) (patt_free_svar Y) dbi ϕ)^{evar:0↦fresh_evar ((fix bsvar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => patt_bound_evar n | patt_bound_svar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_svar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_svar (Nat.pred n) end | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bsvar_subst psi x phi1 $ bsvar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bsvar_subst psi x phi1 ---> bsvar_subst psi x phi2 | ex , phi' => ex , bsvar_subst psi x phi' | mu , phi' => mu , bsvar_subst psi (Datatypes.S x) phi' end) (patt_free_svar Y) dbi ϕ)})
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ex , ϕ)
HfrY: svar_is_fresh_in Y (ex , ϕ)

x : M, eval (update_evar_val (fresh_evar ((fix bsvar_subst (psi : Pattern) (x0 : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => patt_bound_evar n | patt_bound_svar n => match compare_nat n x0 with | Nat_less _ _ _ => patt_bound_svar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_svar (Nat.pred n) end | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bsvar_subst psi x0 phi1 $ bsvar_subst psi x0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bsvar_subst psi x0 phi1 ---> bsvar_subst psi x0 phi2 | ex , phi' => ex , bsvar_subst psi x0 phi' | mu , phi' => mu , bsvar_subst psi (Datatypes.S x0) phi' end) (patt_free_svar X) dbi ϕ)) x (update_svar_val X S ρ)) ((fix bsvar_subst (psi : Pattern) (x0 : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => patt_bound_evar n | patt_bound_svar n => match compare_nat n x0 with | Nat_less _ _ _ => patt_bound_svar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_svar (Nat.pred n) end | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bsvar_subst psi x0 phi1 $ bsvar_subst psi x0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bsvar_subst psi x0 phi1 ---> bsvar_subst psi x0 phi2 | ex , phi' => ex , bsvar_subst psi x0 phi' | mu , phi' => mu , bsvar_subst psi (Datatypes.S x0) phi' end) (patt_free_svar X) dbi ϕ)^{evar:0↦fresh_evar ((fix bsvar_subst (psi : Pattern) (x0 : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => patt_bound_evar n | patt_bound_svar n => match compare_nat n x0 with | Nat_less _ _ _ => patt_bound_svar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_svar (Nat.pred n) end | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bsvar_subst psi x0 phi1 $ bsvar_subst psi x0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bsvar_subst psi x0 phi1 ---> bsvar_subst psi x0 phi2 | ex , phi' => ex , bsvar_subst psi x0 phi' | mu , phi' => mu , bsvar_subst psi (Datatypes.S x0) phi' end) (patt_free_svar X) dbi ϕ)} = eval (update_evar_val (fresh_evar ((fix bsvar_subst (psi : Pattern) (x0 : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => patt_bound_evar n | patt_bound_svar n => match compare_nat n x0 with | Nat_less _ _ _ => patt_bound_svar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_svar (Nat.pred n) end | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bsvar_subst psi x0 phi1 $ bsvar_subst psi x0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bsvar_subst psi x0 phi1 ---> bsvar_subst psi x0 phi2 | ex , phi' => ex , bsvar_subst psi x0 phi' | mu , phi' => mu , bsvar_subst psi (Datatypes.S x0) phi' end) (patt_free_svar Y) dbi ϕ)) x (update_svar_val Y S ρ)) ((fix bsvar_subst (psi : Pattern) (x0 : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => patt_bound_evar n | patt_bound_svar n => match compare_nat n x0 with | Nat_less _ _ _ => patt_bound_svar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_svar (Nat.pred n) end | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bsvar_subst psi x0 phi1 $ bsvar_subst psi x0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bsvar_subst psi x0 phi1 ---> bsvar_subst psi x0 phi2 | ex , phi' => ex , bsvar_subst psi x0 phi' | mu , phi' => mu , bsvar_subst psi (Datatypes.S x0) phi' end) (patt_free_svar Y) dbi ϕ)^{evar:0↦fresh_evar ((fix bsvar_subst (psi : Pattern) (x0 : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => patt_bound_evar n | patt_bound_svar n => match compare_nat n x0 with | Nat_less _ _ _ => patt_bound_svar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_svar (Nat.pred n) end | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bsvar_subst psi x0 phi1 $ bsvar_subst psi x0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bsvar_subst psi x0 phi1 ---> bsvar_subst psi x0 phi2 | ex , phi' => ex , bsvar_subst psi x0 phi' | mu , phi' => mu , bsvar_subst psi (Datatypes.S x0) phi' end) (patt_free_svar Y) dbi ϕ)}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ex , ϕ)
HfrY: svar_is_fresh_in Y (ex , ϕ)
e: M

eval (update_evar_val (fresh_evar ((fix bsvar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => patt_bound_evar n | patt_bound_svar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_svar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_svar (Nat.pred n) end | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bsvar_subst psi x phi1 $ bsvar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bsvar_subst psi x phi1 ---> bsvar_subst psi x phi2 | ex , phi' => ex , bsvar_subst psi x phi' | mu , phi' => mu , bsvar_subst psi (Datatypes.S x) phi' end) (patt_free_svar X) dbi ϕ)) e (update_svar_val X S ρ)) ((fix bsvar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => patt_bound_evar n | patt_bound_svar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_svar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_svar (Nat.pred n) end | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bsvar_subst psi x phi1 $ bsvar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bsvar_subst psi x phi1 ---> bsvar_subst psi x phi2 | ex , phi' => ex , bsvar_subst psi x phi' | mu , phi' => mu , bsvar_subst psi (Datatypes.S x) phi' end) (patt_free_svar X) dbi ϕ)^{evar:0↦fresh_evar ((fix bsvar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => patt_bound_evar n | patt_bound_svar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_svar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_svar (Nat.pred n) end | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bsvar_subst psi x phi1 $ bsvar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bsvar_subst psi x phi1 ---> bsvar_subst psi x phi2 | ex , phi' => ex , bsvar_subst psi x phi' | mu , phi' => mu , bsvar_subst psi (Datatypes.S x) phi' end) (patt_free_svar X) dbi ϕ)} = eval (update_evar_val (fresh_evar ((fix bsvar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => patt_bound_evar n | patt_bound_svar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_svar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_svar (Nat.pred n) end | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bsvar_subst psi x phi1 $ bsvar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bsvar_subst psi x phi1 ---> bsvar_subst psi x phi2 | ex , phi' => ex , bsvar_subst psi x phi' | mu , phi' => mu , bsvar_subst psi (Datatypes.S x) phi' end) (patt_free_svar Y) dbi ϕ)) e (update_svar_val Y S ρ)) ((fix bsvar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => patt_bound_evar n | patt_bound_svar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_svar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_svar (Nat.pred n) end | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bsvar_subst psi x phi1 $ bsvar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bsvar_subst psi x phi1 ---> bsvar_subst psi x phi2 | ex , phi' => ex , bsvar_subst psi x phi' | mu , phi' => mu , bsvar_subst psi (Datatypes.S x) phi' end) (patt_free_svar Y) dbi ϕ)^{evar:0↦fresh_evar ((fix bsvar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => patt_bound_evar n | patt_bound_svar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_svar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_svar (Nat.pred n) end | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bsvar_subst psi x phi1 $ bsvar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bsvar_subst psi x phi1 ---> bsvar_subst psi x phi2 | ex , phi' => ex , bsvar_subst psi x phi' | mu , phi' => mu , bsvar_subst psi (Datatypes.S x) phi' end) (patt_free_svar Y) dbi ϕ)}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ex , ϕ)
HfrY: svar_is_fresh_in Y (ex , ϕ)
e: M

eval (update_evar_val (fresh_evar ((fix bsvar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => patt_bound_evar n | patt_bound_svar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_svar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_svar (Nat.pred n) end | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bsvar_subst psi x phi1 $ bsvar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bsvar_subst psi x phi1 ---> bsvar_subst psi x phi2 | ex , phi' => ex , bsvar_subst psi x phi' | mu , phi' => mu , bsvar_subst psi (Datatypes.S x) phi' end) (patt_free_svar X) dbi ϕ)) e (update_svar_val X S ρ)) ϕ^{evar:0↦fresh_evar ((fix bsvar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => patt_bound_evar n | patt_bound_svar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_svar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_svar (Nat.pred n) end | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bsvar_subst psi x phi1 $ bsvar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bsvar_subst psi x phi1 ---> bsvar_subst psi x phi2 | ex , phi' => ex , bsvar_subst psi x phi' | mu , phi' => mu , bsvar_subst psi (Datatypes.S x) phi' end) (patt_free_svar X) dbi ϕ)}^{svar:dbi↦X} = eval (update_evar_val (fresh_evar ((fix bsvar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => patt_bound_evar n | patt_bound_svar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_svar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_svar (Nat.pred n) end | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bsvar_subst psi x phi1 $ bsvar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bsvar_subst psi x phi1 ---> bsvar_subst psi x phi2 | ex , phi' => ex , bsvar_subst psi x phi' | mu , phi' => mu , bsvar_subst psi (Datatypes.S x) phi' end) (patt_free_svar Y) dbi ϕ)) e (update_svar_val Y S ρ)) ϕ^{evar:0↦fresh_evar ((fix bsvar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => patt_bound_evar n | patt_bound_svar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_svar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_svar (Nat.pred n) end | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bsvar_subst psi x phi1 $ bsvar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bsvar_subst psi x phi1 ---> bsvar_subst psi x phi2 | ex , phi' => ex , bsvar_subst psi x phi' | mu , phi' => mu , bsvar_subst psi (Datatypes.S x) phi' end) (patt_free_svar Y) dbi ϕ)}^{svar:dbi↦Y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ex , ϕ)
HfrY: svar_is_fresh_in Y (ex , ϕ)
e: M

eval (update_evar_val (fresh_evar ϕ^[svar:dbi↦patt_free_svar X]) e (update_svar_val X S ρ)) ϕ^{evar:0↦fresh_evar ϕ^[svar:dbi↦patt_free_svar X]}^{svar:dbi↦X} = eval (update_evar_val (fresh_evar ϕ^[svar:dbi↦patt_free_svar Y]) e (update_svar_val Y S ρ)) ϕ^{evar:0↦fresh_evar ϕ^[svar:dbi↦patt_free_svar Y]}^{svar:dbi↦Y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ex , ϕ)
HfrY: svar_is_fresh_in Y (ex , ϕ)
e: M

eval (update_evar_val (fresh_evar ϕ^[svar:dbi↦patt_free_svar X]) e (update_svar_val X S ρ)) ϕ^{evar:0↦fresh_evar ϕ^[svar:dbi↦patt_free_svar X]}^{svar:dbi↦X} = eval (update_evar_val (fresh_evar ϕ^[svar:dbi↦patt_free_svar Y]) e (update_svar_val Y S ρ)) ϕ^{evar:0↦fresh_evar ϕ^[svar:dbi↦patt_free_svar Y]}^{svar:dbi↦Y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ex , ϕ)
HfrY: svar_is_fresh_in Y (ex , ϕ)
e: M

eval (update_svar_val X S (update_evar_val (fresh_evar ϕ^[svar:dbi↦patt_free_svar X]) e ρ)) ϕ^{evar:0↦fresh_evar ϕ^[svar:dbi↦patt_free_svar X]}^{svar:dbi↦X} = eval (update_svar_val Y S (update_evar_val (fresh_evar ϕ^[svar:dbi↦patt_free_svar Y]) e ρ)) ϕ^{evar:0↦fresh_evar ϕ^[svar:dbi↦patt_free_svar Y]}^{svar:dbi↦Y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ex , ϕ)
HfrY: svar_is_fresh_in Y (ex , ϕ)
e: M

size ϕ^{evar:0↦fresh_evar ϕ^[svar:dbi↦patt_free_svar X]} ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ex , ϕ)
HfrY: svar_is_fresh_in Y (ex , ϕ)
e: M
svar_is_fresh_in X ϕ^{evar:0↦fresh_evar ϕ^[svar:dbi↦patt_free_svar X]}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ex , ϕ)
HfrY: svar_is_fresh_in Y (ex , ϕ)
e: M
svar_is_fresh_in Y ϕ^{evar:0↦fresh_evar ϕ^[svar:dbi↦patt_free_svar X]}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ex , ϕ)
HfrY: svar_is_fresh_in Y (ex , ϕ)
e: M
eval (update_svar_val Y S (update_evar_val (fresh_evar ϕ^[svar:dbi↦patt_free_svar X]) e ρ)) ϕ^{evar:0↦fresh_evar ϕ^[svar:dbi↦patt_free_svar X]}^{svar:dbi↦Y} = eval (update_svar_val Y S (update_evar_val (fresh_evar ϕ^[svar:dbi↦patt_free_svar Y]) e ρ)) ϕ^{evar:0↦fresh_evar ϕ^[svar:dbi↦patt_free_svar Y]}^{svar:dbi↦Y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ex , ϕ)
HfrY: svar_is_fresh_in Y (ex , ϕ)
e: M

size ϕ^{evar:0↦fresh_evar ϕ^[svar:dbi↦patt_free_svar X]} ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ex , ϕ)
HfrY: svar_is_fresh_in Y (ex , ϕ)
e: M

size ϕ ≤ sz
lia.
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ex , ϕ)
HfrY: svar_is_fresh_in Y (ex , ϕ)
e: M

svar_is_fresh_in X ϕ^{evar:0↦fresh_evar ϕ^[svar:dbi↦patt_free_svar X]}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ex , ϕ)
HfrY: svar_is_fresh_in Y (ex , ϕ)
e: M
svar_is_fresh_in Y ϕ^{evar:0↦fresh_evar ϕ^[svar:dbi↦patt_free_svar X]}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ex , ϕ)
HfrY: svar_is_fresh_in Y (ex , ϕ)
e: M
eval (update_svar_val Y S (update_evar_val (fresh_evar ϕ^[svar:dbi↦patt_free_svar X]) e ρ)) ϕ^{evar:0↦fresh_evar ϕ^[svar:dbi↦patt_free_svar X]}^{svar:dbi↦Y} = eval (update_svar_val Y S (update_evar_val (fresh_evar ϕ^[svar:dbi↦patt_free_svar Y]) e ρ)) ϕ^{evar:0↦fresh_evar ϕ^[svar:dbi↦patt_free_svar Y]}^{svar:dbi↦Y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ex , ϕ)
HfrY: svar_is_fresh_in Y (ex , ϕ)
e: M

svar_is_fresh_in X ϕ^{evar:0↦fresh_evar ϕ^[svar:dbi↦patt_free_svar X]}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ex , (ex , ϕ))
HfrY: svar_is_fresh_in Y (ex , ϕ)
e: M

svar_is_fresh_in X ϕ^{evar:0↦fresh_evar ϕ^[svar:dbi↦patt_free_svar X]}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ex , (ex , ϕ))
HfrY: svar_is_fresh_in Y (ex , (ex , ϕ))
e: M

svar_is_fresh_in X ϕ^{evar:0↦fresh_evar ϕ^[svar:dbi↦patt_free_svar X]}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ex , (ex , ϕ))
HfrY: svar_is_fresh_in Y (ex , (ex , ϕ))
e: M

svar_is_fresh_in X ϕ
apply HfrX.
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ex , ϕ)
HfrY: svar_is_fresh_in Y (ex , ϕ)
e: M

svar_is_fresh_in Y ϕ^{evar:0↦fresh_evar ϕ^[svar:dbi↦patt_free_svar X]}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ex , ϕ)
HfrY: svar_is_fresh_in Y (ex , ϕ)
e: M
eval (update_svar_val Y S (update_evar_val (fresh_evar ϕ^[svar:dbi↦patt_free_svar X]) e ρ)) ϕ^{evar:0↦fresh_evar ϕ^[svar:dbi↦patt_free_svar X]}^{svar:dbi↦Y} = eval (update_svar_val Y S (update_evar_val (fresh_evar ϕ^[svar:dbi↦patt_free_svar Y]) e ρ)) ϕ^{evar:0↦fresh_evar ϕ^[svar:dbi↦patt_free_svar Y]}^{svar:dbi↦Y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ex , ϕ)
HfrY: svar_is_fresh_in Y (ex , ϕ)
e: M

svar_is_fresh_in Y ϕ^{evar:0↦fresh_evar ϕ^[svar:dbi↦patt_free_svar X]}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ex , ϕ)
HfrY: svar_is_fresh_in Y (ex , ϕ)
e: M

svar_is_fresh_in Y ϕ
apply HfrY.
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ex , ϕ)
HfrY: svar_is_fresh_in Y (ex , ϕ)
e: M

eval (update_svar_val Y S (update_evar_val (fresh_evar ϕ^[svar:dbi↦patt_free_svar X]) e ρ)) ϕ^{evar:0↦fresh_evar ϕ^[svar:dbi↦patt_free_svar X]}^{svar:dbi↦Y} = eval (update_svar_val Y S (update_evar_val (fresh_evar ϕ^[svar:dbi↦patt_free_svar Y]) e ρ)) ϕ^{evar:0↦fresh_evar ϕ^[svar:dbi↦patt_free_svar Y]}^{svar:dbi↦Y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ex , ϕ)
HfrY: svar_is_fresh_in Y (ex , ϕ)
e: M

eval (update_svar_val Y S (update_evar_val (fresh_evar ϕ^[svar:dbi↦patt_free_svar X]) e ρ)) ϕ^{svar:dbi↦Y}^{evar:0↦fresh_evar ϕ^[svar:dbi↦patt_free_svar X]} = eval (update_svar_val Y S (update_evar_val (fresh_evar ϕ^[svar:dbi↦patt_free_svar Y]) e ρ)) ϕ^{svar:dbi↦Y}^{evar:0↦fresh_evar ϕ^[svar:dbi↦patt_free_svar Y]}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ex , ϕ)
HfrY: svar_is_fresh_in Y (ex , ϕ)
e: M

eval (update_evar_val (fresh_evar ϕ^[svar:dbi↦patt_free_svar X]) e (update_svar_val Y S ρ)) ϕ^{svar:dbi↦Y}^{evar:0↦fresh_evar ϕ^[svar:dbi↦patt_free_svar X]} = eval (update_evar_val (fresh_evar ϕ^[svar:dbi↦patt_free_svar Y]) e (update_svar_val Y S ρ)) ϕ^{svar:dbi↦Y}^{evar:0↦fresh_evar ϕ^[svar:dbi↦patt_free_svar Y]}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ex , ϕ)
HfrY: svar_is_fresh_in Y (ex , ϕ)
e: M

size ϕ^{svar:dbi↦Y} ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ex , ϕ)
HfrY: svar_is_fresh_in Y (ex , ϕ)
e: M
evar_is_fresh_in (fresh_evar ϕ^[svar:dbi↦patt_free_svar X]) ϕ^{svar:dbi↦Y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ex , ϕ)
HfrY: svar_is_fresh_in Y (ex , ϕ)
e: M
evar_is_fresh_in (fresh_evar ϕ^{svar:dbi↦Y}) ϕ^{svar:dbi↦Y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ex , ϕ)
HfrY: svar_is_fresh_in Y (ex , ϕ)
e: M
eval (update_evar_val (fresh_evar ϕ^{svar:dbi↦Y}) e (update_svar_val Y S ρ)) ϕ^{svar:dbi↦Y}^{evar:0↦ fresh_evar ϕ^{svar:dbi↦Y}} = eval (update_evar_val (fresh_evar ϕ^[svar:dbi↦patt_free_svar Y]) e (update_svar_val Y S ρ)) ϕ^{svar:dbi↦Y}^{evar:0↦ fresh_evar ϕ^[svar:dbi↦ patt_free_svar Y]}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ex , ϕ)
HfrY: svar_is_fresh_in Y (ex , ϕ)
e: M

size ϕ ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ex , ϕ)
HfrY: svar_is_fresh_in Y (ex , ϕ)
e: M
evar_is_fresh_in (fresh_evar ϕ^[svar:dbi↦patt_free_svar X]) ϕ^{svar:dbi↦Y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ex , ϕ)
HfrY: svar_is_fresh_in Y (ex , ϕ)
e: M
evar_is_fresh_in (fresh_evar ϕ^{svar:dbi↦Y}) ϕ^{svar:dbi↦Y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ex , ϕ)
HfrY: svar_is_fresh_in Y (ex , ϕ)
e: M
eval (update_evar_val (fresh_evar ϕ^{svar:dbi↦Y}) e (update_svar_val Y S ρ)) ϕ^{svar:dbi↦Y}^{evar:0↦ fresh_evar ϕ^{svar:dbi↦Y}} = eval (update_evar_val (fresh_evar ϕ^[svar:dbi↦patt_free_svar Y]) e (update_svar_val Y S ρ)) ϕ^{svar:dbi↦Y}^{evar:0↦ fresh_evar ϕ^[svar:dbi↦ patt_free_svar Y]}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ex , ϕ)
HfrY: svar_is_fresh_in Y (ex , ϕ)
e: M

evar_is_fresh_in (fresh_evar ϕ^[svar:dbi↦patt_free_svar X]) ϕ^{svar:dbi↦Y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ex , ϕ)
HfrY: svar_is_fresh_in Y (ex , ϕ)
e: M
evar_is_fresh_in (fresh_evar ϕ^{svar:dbi↦Y}) ϕ^{svar:dbi↦Y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ex , ϕ)
HfrY: svar_is_fresh_in Y (ex , ϕ)
e: M
eval (update_evar_val (fresh_evar ϕ^{svar:dbi↦Y}) e (update_svar_val Y S ρ)) ϕ^{svar:dbi↦Y}^{evar:0↦ fresh_evar ϕ^{svar:dbi↦Y}} = eval (update_evar_val (fresh_evar ϕ^[svar:dbi↦patt_free_svar Y]) e (update_svar_val Y S ρ)) ϕ^{svar:dbi↦Y}^{evar:0↦ fresh_evar ϕ^[svar:dbi↦ patt_free_svar Y]}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ex , ϕ)
HfrY: svar_is_fresh_in Y (ex , ϕ)
e: M

evar_is_fresh_in (fresh_evar ϕ) ϕ^{svar:dbi↦Y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ex , ϕ)
HfrY: svar_is_fresh_in Y (ex , ϕ)
e: M
evar_is_fresh_in (fresh_evar ϕ^{svar:dbi↦Y}) ϕ^{svar:dbi↦Y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ex , ϕ)
HfrY: svar_is_fresh_in Y (ex , ϕ)
e: M
eval (update_evar_val (fresh_evar ϕ^{svar:dbi↦Y}) e (update_svar_val Y S ρ)) ϕ^{svar:dbi↦Y}^{evar:0↦ fresh_evar ϕ^{svar:dbi↦Y}} = eval (update_evar_val (fresh_evar ϕ^[svar:dbi↦patt_free_svar Y]) e (update_svar_val Y S ρ)) ϕ^{svar:dbi↦Y}^{evar:0↦ fresh_evar ϕ^[svar:dbi↦ patt_free_svar Y]}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ex , ϕ)
HfrY: svar_is_fresh_in Y (ex , ϕ)
e: M

evar_is_fresh_in (fresh_evar ϕ) ϕ
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ex , ϕ)
HfrY: svar_is_fresh_in Y (ex , ϕ)
e: M
evar_is_fresh_in (fresh_evar ϕ^{svar:dbi↦Y}) ϕ^{svar:dbi↦Y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ex , ϕ)
HfrY: svar_is_fresh_in Y (ex , ϕ)
e: M
eval (update_evar_val (fresh_evar ϕ^{svar:dbi↦Y}) e (update_svar_val Y S ρ)) ϕ^{svar:dbi↦Y}^{evar:0↦ fresh_evar ϕ^{svar:dbi↦Y}} = eval (update_evar_val (fresh_evar ϕ^[svar:dbi↦patt_free_svar Y]) e (update_svar_val Y S ρ)) ϕ^{svar:dbi↦Y}^{evar:0↦ fresh_evar ϕ^[svar:dbi↦ patt_free_svar Y]}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ex , ϕ)
HfrY: svar_is_fresh_in Y (ex , ϕ)
e: M

evar_is_fresh_in (fresh_evar ϕ^{svar:dbi↦Y}) ϕ^{svar:dbi↦Y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ex , ϕ)
HfrY: svar_is_fresh_in Y (ex , ϕ)
e: M
eval (update_evar_val (fresh_evar ϕ^{svar:dbi↦Y}) e (update_svar_val Y S ρ)) ϕ^{svar:dbi↦Y}^{evar:0↦ fresh_evar ϕ^{svar:dbi↦Y}} = eval (update_evar_val (fresh_evar ϕ^[svar:dbi↦patt_free_svar Y]) e (update_svar_val Y S ρ)) ϕ^{svar:dbi↦Y}^{evar:0↦ fresh_evar ϕ^[svar:dbi↦ patt_free_svar Y]}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ex , ϕ)
HfrY: svar_is_fresh_in Y (ex , ϕ)
e: M

eval (update_evar_val (fresh_evar ϕ^{svar:dbi↦Y}) e (update_svar_val Y S ρ)) ϕ^{svar:dbi↦Y}^{evar:0↦fresh_evar ϕ^{svar:dbi↦Y}} = eval (update_evar_val (fresh_evar ϕ^[svar:dbi↦patt_free_svar Y]) e (update_svar_val Y S ρ)) ϕ^{svar:dbi↦Y}^{evar:0↦fresh_evar ϕ^[svar:dbi↦patt_free_svar Y]}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ex , ϕ)
HfrY: svar_is_fresh_in Y (ex , ϕ)
e: M

eval (update_svar_val Y S (update_evar_val (fresh_evar ϕ^{svar:dbi↦Y}) e ρ)) ϕ^{svar:dbi↦Y}^{evar:0↦fresh_evar ϕ^{svar:dbi↦Y}} = eval (update_svar_val Y S (update_evar_val (fresh_evar ϕ^{svar:dbi↦Y}) e ρ)) ϕ^{svar:dbi↦Y}^{evar:0↦fresh_evar ϕ^[svar:dbi↦patt_free_svar Y]}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ex , ϕ)
HfrY: svar_is_fresh_in Y (ex , ϕ)
e: M

eval (update_svar_val Y S (update_evar_val (fresh_evar ϕ^{svar:dbi↦Y}) e ρ)) ϕ^{svar:dbi↦Y}^{evar:0↦fresh_evar ϕ^{svar:dbi↦Y}} = eval (update_svar_val Y S (update_evar_val (fresh_evar ϕ^{svar:dbi↦Y}) e ρ)) ϕ^{svar:dbi↦Y}^{evar:0↦fresh_evar ϕ^[svar:dbi↦patt_free_svar Y]}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ex , ϕ)
HfrY: svar_is_fresh_in Y (ex , ϕ)
e: M

eval (update_svar_val Y S (update_evar_val (fresh_evar ϕ^[svar:dbi↦patt_free_svar Y]) e ρ)) ϕ^[svar:dbi↦patt_free_svar Y]^{evar:0↦fresh_evar ϕ^[svar:dbi↦ patt_free_svar Y]} = eval (update_svar_val Y S (update_evar_val (fresh_evar ϕ^[svar:dbi↦patt_free_svar Y]) e ρ)) ϕ^[svar:dbi↦patt_free_svar Y]^{evar:0↦fresh_evar ϕ^[svar:dbi↦ patt_free_svar Y]}
reflexivity.
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (mu , ϕ)
HfrY: svar_is_fresh_in Y (mu , ϕ)

eval (update_svar_val X S ρ) (mu , ϕ)^{svar:dbi↦X} = eval (update_svar_val Y S ρ) (mu , ϕ)^{svar:dbi↦Y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (mu , ϕ)
HfrY: svar_is_fresh_in Y (mu , ϕ)

eval (update_svar_val X S ρ) (mu , ϕ^{svar:increase_mu pm_spec_data dbi↦X}) = eval (update_svar_val Y S ρ) (mu , ϕ^{svar:increase_mu pm_spec_data dbi↦Y})
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (mu , ϕ)
HfrY: svar_is_fresh_in Y (mu , ϕ)

eval (update_svar_val X S ρ) (mu , ϕ^{svar:Datatypes.S dbi↦X}) = eval (update_svar_val Y S ρ) (mu , ϕ^{svar:Datatypes.S dbi↦Y})
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (mu , ϕ)
HfrY: svar_is_fresh_in Y (mu , ϕ)

(let X0 := fresh_svar ϕ^{svar:Datatypes.S dbi↦X} in LeastFixpointOf (λ S0 : propset M, let ρ' := update_svar_val X0 S0 (update_svar_val X S ρ) in eval ρ' ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦X0})) = (let X := fresh_svar ϕ^{svar:Datatypes.S dbi↦Y} in LeastFixpointOf (λ S0 : propset M, let ρ' := update_svar_val X S0 (update_svar_val Y S ρ) in eval ρ' ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦X}))
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (mu , ϕ)
HfrY: svar_is_fresh_in Y (mu , ϕ)

LeastFixpointOf (λ S0 : propset M, eval (update_svar_val (fresh_svar ϕ^{svar:Datatypes.S dbi↦X}) S0 (update_svar_val X S ρ)) ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦fresh_svar ϕ^{svar: Datatypes.S dbi↦X}}) = LeastFixpointOf (λ S0 : propset M, eval (update_svar_val (fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}) S0 (update_svar_val Y S ρ)) ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦fresh_svar ϕ^{svar: Datatypes.S dbi↦Y}})
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (mu , ϕ)
HfrY: svar_is_fresh_in Y (mu , ϕ)

(λ S0 : propset M, eval (update_svar_val (fresh_svar ϕ^{svar:Datatypes.S dbi↦X}) S0 (update_svar_val X S ρ)) ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦fresh_svar ϕ^{svar: Datatypes.S dbi↦X}}) = (λ S0 : propset M, eval (update_svar_val (fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}) S0 (update_svar_val Y S ρ)) ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦fresh_svar ϕ^{svar: Datatypes.S dbi↦Y}})
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (mu , ϕ)
HfrY: svar_is_fresh_in Y (mu , ϕ)

x : propset M, eval (update_svar_val (fresh_svar ϕ^{svar:Datatypes.S dbi↦X}) x (update_svar_val X S ρ)) ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦fresh_svar ϕ^{svar:Datatypes.S dbi↦X}} = eval (update_svar_val (fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}) x (update_svar_val Y S ρ)) ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (mu , ϕ)
HfrY: svar_is_fresh_in Y (mu , ϕ)
S': propset M

eval (update_svar_val (fresh_svar ϕ^{svar:Datatypes.S dbi↦X}) S' (update_svar_val X S ρ)) ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦fresh_svar ϕ^{svar:Datatypes.S dbi↦X}} = eval (update_svar_val (fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}) S' (update_svar_val Y S ρ)) ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (mu , ϕ)
HfrY: svar_is_fresh_in Y (mu , ϕ)
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}

eval (update_svar_val X' S' (update_svar_val X S ρ)) ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦X'} = eval (update_svar_val (fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}) S' (update_svar_val Y S ρ)) ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (mu , ϕ)
HfrY: svar_is_fresh_in Y (mu , ϕ)
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}

eval (update_svar_val X' S' (update_svar_val X S ρ)) ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦X'} = eval (update_svar_val Y' S' (update_svar_val Y S ρ)) ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦Y'}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (mu , ϕ)
HfrY: svar_is_fresh_in Y (mu , ϕ)
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
B: SVarSet
HeqB: B = {[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))

eval (update_svar_val X' S' (update_svar_val X S ρ)) ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦X'} = eval (update_svar_val Y' S' (update_svar_val Y S ρ)) ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦Y'}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (mu , ϕ)
HfrY: svar_is_fresh_in Y (mu , ϕ)
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
B: SVarSet
HeqB: B = {[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))
fresh3: svar
Heqfresh3: fresh3 = svar_fresh (elements B)

eval (update_svar_val X' S' (update_svar_val X S ρ)) ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦X'} = eval (update_svar_val Y' S' (update_svar_val Y S ρ)) ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦Y'}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (mu , ϕ)
HfrY: svar_is_fresh_in Y (mu , ϕ)
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
B: SVarSet
HeqB: B = {[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))
fresh3: svar
Heqfresh3: fresh3 = svar_fresh (elements B)

fresh3 ∉ B
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (mu , ϕ)
HfrY: svar_is_fresh_in Y (mu , ϕ)
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
B: SVarSet
HeqB: B = {[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))
fresh3: svar
Heqfresh3: fresh3 = svar_fresh (elements B)
HB: fresh3 ∉ B
eval (update_svar_val X' S' (update_svar_val X S ρ)) ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦X'} = eval (update_svar_val Y' S' (update_svar_val Y S ρ)) ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦Y'}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (mu , ϕ)
HfrY: svar_is_fresh_in Y (mu , ϕ)
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
B: SVarSet
HeqB: B = {[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))
fresh3: svar
Heqfresh3: fresh3 = svar_fresh (elements B)

fresh3 ∉ B
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (mu , ϕ)
HfrY: svar_is_fresh_in Y (mu , ϕ)
S': propset M

svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[fresh_svar ϕ^{svar:Datatypes.S dbi↦X}]} ∪ ({[fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}]} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ))))))) ∉ {[X]} ∪ ({[Y]} ∪ ({[fresh_svar ϕ^{svar:Datatypes.S dbi↦X}]} ∪ ({[fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}]} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))
apply set_svar_fresh_is_fresh'.
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (mu , ϕ)
HfrY: svar_is_fresh_in Y (mu , ϕ)
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
B: SVarSet
HeqB: B = {[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))
fresh3: svar
Heqfresh3: fresh3 = svar_fresh (elements B)
HB: fresh3 ∉ B

eval (update_svar_val X' S' (update_svar_val X S ρ)) ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦X'} = eval (update_svar_val Y' S' (update_svar_val Y S ρ)) ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦Y'}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (mu , ϕ)
HfrY: svar_is_fresh_in Y (mu , ϕ)
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
B, B0: SVarSet
HeqB0: B0 = free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ
HeqB: B = {[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ B0))))
fresh3: svar
Heqfresh3: fresh3 = svar_fresh (elements B)
HB: fresh3 ∉ B

eval (update_svar_val X' S' (update_svar_val X S ρ)) ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦X'} = eval (update_svar_val Y' S' (update_svar_val Y S ρ)) ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦Y'}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (mu , ϕ)
HfrY: svar_is_fresh_in Y (mu , ϕ)
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
B, B0: SVarSet
HeqB0: B0 = free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ
B1: SVarSet
HeqB1: B1 = free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ B0
HeqB: B = {[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ B1)))
fresh3: svar
Heqfresh3: fresh3 = svar_fresh (elements B)
HB: fresh3 ∉ B

eval (update_svar_val X' S' (update_svar_val X S ρ)) ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦X'} = eval (update_svar_val Y' S' (update_svar_val Y S ρ)) ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦Y'}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (mu , ϕ)
HfrY: svar_is_fresh_in Y (mu , ϕ)
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
B, B0: SVarSet
HeqB0: B0 = free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ
B1: SVarSet
HeqB1: B1 = free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ B0
B2: SVarSet
HeqB2: B2 = {[Y']} ∪ B1
HeqB: B = {[X]} ∪ ({[Y]} ∪ ({[X']} ∪ B2))
fresh3: svar
Heqfresh3: fresh3 = svar_fresh (elements B)
HB: fresh3 ∉ B

eval (update_svar_val X' S' (update_svar_val X S ρ)) ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦X'} = eval (update_svar_val Y' S' (update_svar_val Y S ρ)) ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦Y'}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (mu , ϕ)
HfrY: svar_is_fresh_in Y (mu , ϕ)
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
B, B0: SVarSet
HeqB0: B0 = free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ
B1: SVarSet
HeqB1: B1 = free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ B0
B2: SVarSet
HeqB2: B2 = {[Y']} ∪ B1
B3: SVarSet
HeqB3: B3 = {[X']} ∪ B2
HeqB: B = {[X]} ∪ ({[Y]} ∪ B3)
fresh3: svar
Heqfresh3: fresh3 = svar_fresh (elements B)
HB: fresh3 ∉ B

eval (update_svar_val X' S' (update_svar_val X S ρ)) ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦X'} = eval (update_svar_val Y' S' (update_svar_val Y S ρ)) ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦Y'}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (mu , ϕ)
HfrY: svar_is_fresh_in Y (mu , ϕ)
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
B, B0: SVarSet
HeqB0: B0 = free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ
B1: SVarSet
HeqB1: B1 = free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ B0
B2: SVarSet
HeqB2: B2 = {[Y']} ∪ B1
B3: SVarSet
HeqB3: B3 = {[X']} ∪ B2
B4: SVarSet
HeqB4: B4 = {[Y]} ∪ B3
HeqB: B = {[X]} ∪ B4
fresh3: svar
Heqfresh3: fresh3 = svar_fresh (elements B)
HB: fresh3 ∉ B

eval (update_svar_val X' S' (update_svar_val X S ρ)) ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦X'} = eval (update_svar_val Y' S' (update_svar_val Y S ρ)) ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦Y'}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (mu , ϕ)
HfrY: svar_is_fresh_in Y (mu , ϕ)
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
B, B0: SVarSet
HeqB0: B0 = free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ
B1: SVarSet
HeqB1: B1 = free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ B0
B2: SVarSet
HeqB2: B2 = {[Y']} ∪ B1
B3: SVarSet
HeqB3: B3 = {[X']} ∪ B2
B4: SVarSet
HeqB4: B4 = {[Y]} ∪ B3
HeqB: B = {[X]} ∪ B4
fresh3: svar
Heqfresh3: fresh3 = svar_fresh (elements B)
HB: fresh3 ∉ B
i: fresh3 ∉ {[X]} ∪ B4 ↔ (fresh3 ∉ {[X]}) ∧ fresh3 ∉ B4

eval (update_svar_val X' S' (update_svar_val X S ρ)) ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦X'} = eval (update_svar_val Y' S' (update_svar_val Y S ρ)) ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦Y'}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (mu , ϕ)
HfrY: svar_is_fresh_in Y (mu , ϕ)
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
B, B0: SVarSet
HeqB0: B0 = free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ
B1: SVarSet
HeqB1: B1 = free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ B0
B2: SVarSet
HeqB2: B2 = {[Y']} ∪ B1
B3: SVarSet
HeqB3: B3 = {[X']} ∪ B2
B4: SVarSet
HeqB4: B4 = {[Y]} ∪ B3
HeqB: B = {[X]} ∪ B4
fresh3: svar
Heqfresh3: fresh3 = svar_fresh (elements B)
HB: fresh3 ∉ B
i: fresh3 ∉ {[X]} ∪ B4 ↔ (fresh3 ∉ {[X]}) ∧ fresh3 ∉ B4
i0: fresh3 ∉ {[Y]} ∪ B3 ↔ (fresh3 ∉ {[Y]}) ∧ fresh3 ∉ B3

eval (update_svar_val X' S' (update_svar_val X S ρ)) ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦X'} = eval (update_svar_val Y' S' (update_svar_val Y S ρ)) ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦Y'}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (mu , ϕ)
HfrY: svar_is_fresh_in Y (mu , ϕ)
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
B, B0: SVarSet
HeqB0: B0 = free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ
B1: SVarSet
HeqB1: B1 = free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ B0
B2: SVarSet
HeqB2: B2 = {[Y']} ∪ B1
B3: SVarSet
HeqB3: B3 = {[X']} ∪ B2
B4: SVarSet
HeqB4: B4 = {[Y]} ∪ B3
HeqB: B = {[X]} ∪ B4
fresh3: svar
Heqfresh3: fresh3 = svar_fresh (elements B)
HB: fresh3 ∉ B
i: fresh3 ∉ {[X]} ∪ B4 ↔ (fresh3 ∉ {[X]}) ∧ fresh3 ∉ B4
i0: fresh3 ∉ {[Y]} ∪ B3 ↔ (fresh3 ∉ {[Y]}) ∧ fresh3 ∉ B3
i1: fresh3 ∉ {[X']} ∪ B2 ↔ (fresh3 ∉ {[X']}) ∧ fresh3 ∉ B2

eval (update_svar_val X' S' (update_svar_val X S ρ)) ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦X'} = eval (update_svar_val Y' S' (update_svar_val Y S ρ)) ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦Y'}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (mu , ϕ)
HfrY: svar_is_fresh_in Y (mu , ϕ)
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
B, B0: SVarSet
HeqB0: B0 = free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ
B1: SVarSet
HeqB1: B1 = free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ B0
B2: SVarSet
HeqB2: B2 = {[Y']} ∪ B1
B3: SVarSet
HeqB3: B3 = {[X']} ∪ B2
B4: SVarSet
HeqB4: B4 = {[Y]} ∪ B3
HeqB: B = {[X]} ∪ B4
fresh3: svar
Heqfresh3: fresh3 = svar_fresh (elements B)
HB: fresh3 ∉ B
i: fresh3 ∉ {[X]} ∪ B4 ↔ (fresh3 ∉ {[X]}) ∧ fresh3 ∉ B4
i0: fresh3 ∉ {[Y]} ∪ B3 ↔ (fresh3 ∉ {[Y]}) ∧ fresh3 ∉ B3
i1: fresh3 ∉ {[X']} ∪ B2 ↔ (fresh3 ∉ {[X']}) ∧ fresh3 ∉ B2
i2: fresh3 ∉ {[Y']} ∪ B1 ↔ (fresh3 ∉ {[Y']}) ∧ fresh3 ∉ B1

eval (update_svar_val X' S' (update_svar_val X S ρ)) ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦X'} = eval (update_svar_val Y' S' (update_svar_val Y S ρ)) ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦Y'}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (mu , ϕ)
HfrY: svar_is_fresh_in Y (mu , ϕ)
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
B, B0: SVarSet
HeqB0: B0 = free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ
B1: SVarSet
HeqB1: B1 = free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ B0
B2: SVarSet
HeqB2: B2 = {[Y']} ∪ B1
B3: SVarSet
HeqB3: B3 = {[X']} ∪ B2
B4: SVarSet
HeqB4: B4 = {[Y]} ∪ B3
HeqB: B = {[X]} ∪ B4
fresh3: svar
Heqfresh3: fresh3 = svar_fresh (elements B)
HB: fresh3 ∉ B
i: fresh3 ∉ {[X]} ∪ B4 ↔ (fresh3 ∉ {[X]}) ∧ fresh3 ∉ B4
i0: fresh3 ∉ {[Y]} ∪ B3 ↔ (fresh3 ∉ {[Y]}) ∧ fresh3 ∉ B3
i1: fresh3 ∉ {[X']} ∪ B2 ↔ (fresh3 ∉ {[X']}) ∧ fresh3 ∉ B2
i2: fresh3 ∉ {[Y']} ∪ B1 ↔ (fresh3 ∉ {[Y']}) ∧ fresh3 ∉ B1
i3: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ B0 ↔ (fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}) ∧ fresh3 ∉ B0

eval (update_svar_val X' S' (update_svar_val X S ρ)) ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦X'} = eval (update_svar_val Y' S' (update_svar_val Y S ρ)) ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦Y'}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (mu , ϕ)
HfrY: svar_is_fresh_in Y (mu , ϕ)
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
B, B1: SVarSet
HeqB1: B1 = free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ)
B2: SVarSet
HeqB2: B2 = {[Y']} ∪ B1
B3: SVarSet
HeqB3: B3 = {[X']} ∪ B2
B4: SVarSet
HeqB4: B4 = {[Y]} ∪ B3
HeqB: B = {[X]} ∪ B4
fresh3: svar
Heqfresh3: fresh3 = svar_fresh (elements B)
HB: fresh3 ∉ B
i: fresh3 ∉ {[X]} ∪ B4 ↔ (fresh3 ∉ {[X]}) ∧ fresh3 ∉ B4
i0: fresh3 ∉ {[Y]} ∪ B3 ↔ (fresh3 ∉ {[Y]}) ∧ fresh3 ∉ B3
i1: fresh3 ∉ {[X']} ∪ B2 ↔ (fresh3 ∉ {[X']}) ∧ fresh3 ∉ B2
i2: fresh3 ∉ {[Y']} ∪ B1 ↔ (fresh3 ∉ {[Y']}) ∧ fresh3 ∉ B1
i3: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ) ↔ (fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}) ∧ fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ

eval (update_svar_val X' S' (update_svar_val X S ρ)) ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦X'} = eval (update_svar_val Y' S' (update_svar_val Y S ρ)) ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦Y'}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (mu , ϕ)
HfrY: svar_is_fresh_in Y (mu , ϕ)
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
B, B2: SVarSet
HeqB2: B2 = {[Y']} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ))
B3: SVarSet
HeqB3: B3 = {[X']} ∪ B2
B4: SVarSet
HeqB4: B4 = {[Y]} ∪ B3
HeqB: B = {[X]} ∪ B4
fresh3: svar
Heqfresh3: fresh3 = svar_fresh (elements B)
HB: fresh3 ∉ B
i: fresh3 ∉ {[X]} ∪ B4 ↔ (fresh3 ∉ {[X]}) ∧ fresh3 ∉ B4
i0: fresh3 ∉ {[Y]} ∪ B3 ↔ (fresh3 ∉ {[Y]}) ∧ fresh3 ∉ B3
i1: fresh3 ∉ {[X']} ∪ B2 ↔ (fresh3 ∉ {[X']}) ∧ fresh3 ∉ B2
i2: fresh3 ∉ {[Y']} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ)) ↔ (fresh3 ∉ {[Y']}) ∧ fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ)
i3: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ) ↔ (fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}) ∧ fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ

eval (update_svar_val X' S' (update_svar_val X S ρ)) ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦X'} = eval (update_svar_val Y' S' (update_svar_val Y S ρ)) ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦Y'}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (mu , ϕ)
HfrY: svar_is_fresh_in Y (mu , ϕ)
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
B, B3: SVarSet
HeqB3: B3 = {[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ)))
B4: SVarSet
HeqB4: B4 = {[Y]} ∪ B3
HeqB: B = {[X]} ∪ B4
fresh3: svar
Heqfresh3: fresh3 = svar_fresh (elements B)
HB: fresh3 ∉ B
i: fresh3 ∉ {[X]} ∪ B4 ↔ (fresh3 ∉ {[X]}) ∧ fresh3 ∉ B4
i0: fresh3 ∉ {[Y]} ∪ B3 ↔ (fresh3 ∉ {[Y]}) ∧ fresh3 ∉ B3
i1: fresh3 ∉ {[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ))) ↔ (fresh3 ∉ {[X']}) ∧ fresh3 ∉ {[Y']} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ))
i2: fresh3 ∉ {[Y']} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ)) ↔ (fresh3 ∉ {[Y']}) ∧ fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ)
i3: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ) ↔ (fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}) ∧ fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ

eval (update_svar_val X' S' (update_svar_val X S ρ)) ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦X'} = eval (update_svar_val Y' S' (update_svar_val Y S ρ)) ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦Y'}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (mu , ϕ)
HfrY: svar_is_fresh_in Y (mu , ϕ)
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
B, B4: SVarSet
HeqB4: B4 = {[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ))))
HeqB: B = {[X]} ∪ B4
fresh3: svar
Heqfresh3: fresh3 = svar_fresh (elements B)
HB: fresh3 ∉ B
i: fresh3 ∉ {[X]} ∪ B4 ↔ (fresh3 ∉ {[X]}) ∧ fresh3 ∉ B4
i0: fresh3 ∉ {[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))) ↔ (fresh3 ∉ {[Y]}) ∧ fresh3 ∉ {[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))
i1: fresh3 ∉ {[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ))) ↔ (fresh3 ∉ {[X']}) ∧ fresh3 ∉ {[Y']} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ))
i2: fresh3 ∉ {[Y']} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ)) ↔ (fresh3 ∉ {[Y']}) ∧ fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ)
i3: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ) ↔ (fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}) ∧ fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ

eval (update_svar_val X' S' (update_svar_val X S ρ)) ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦X'} = eval (update_svar_val Y' S' (update_svar_val Y S ρ)) ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦Y'}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (mu , ϕ)
HfrY: svar_is_fresh_in Y (mu , ϕ)
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
B: SVarSet
HeqB: B = {[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))
fresh3: svar
Heqfresh3: fresh3 = svar_fresh (elements B)
HB: fresh3 ∉ B
i: fresh3 ∉ {[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ))))) ↔ (fresh3 ∉ {[X]}) ∧ fresh3 ∉ {[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ))))
i0: fresh3 ∉ {[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))) ↔ (fresh3 ∉ {[Y]}) ∧ fresh3 ∉ {[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))
i1: fresh3 ∉ {[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ))) ↔ (fresh3 ∉ {[X']}) ∧ fresh3 ∉ {[Y']} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ))
i2: fresh3 ∉ {[Y']} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ)) ↔ (fresh3 ∉ {[Y']}) ∧ fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ)
i3: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ) ↔ (fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}) ∧ fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ

eval (update_svar_val X' S' (update_svar_val X S ρ)) ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦X'} = eval (update_svar_val Y' S' (update_svar_val Y S ρ)) ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦Y'}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (mu , ϕ)
HfrY: svar_is_fresh_in Y (mu , ϕ)
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
HB: fresh3 ∉ {[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))
i: fresh3 ∉ {[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ))))) ↔ (fresh3 ∉ {[X]}) ∧ fresh3 ∉ {[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ))))
i0: fresh3 ∉ {[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))) ↔ (fresh3 ∉ {[Y]}) ∧ fresh3 ∉ {[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))
i1: fresh3 ∉ {[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ))) ↔ (fresh3 ∉ {[X']}) ∧ fresh3 ∉ {[Y']} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ))
i2: fresh3 ∉ {[Y']} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ)) ↔ (fresh3 ∉ {[Y']}) ∧ fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ)
i3: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ) ↔ (fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}) ∧ fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ

eval (update_svar_val X' S' (update_svar_val X S ρ)) ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦X'} = eval (update_svar_val Y' S' (update_svar_val Y S ρ)) ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦Y'}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (mu , ϕ)
HfrY: svar_is_fresh_in Y (mu , ϕ)
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
HB: (fresh3 ∉ {[X]}) ∧ fresh3 ∉ {[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ))))
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))
i: fresh3 ∉ {[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ))))) ↔ (fresh3 ∉ {[X]}) ∧ fresh3 ∉ {[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ))))
i0: fresh3 ∉ {[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))) ↔ (fresh3 ∉ {[Y]}) ∧ fresh3 ∉ {[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))
i1: fresh3 ∉ {[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ))) ↔ (fresh3 ∉ {[X']}) ∧ fresh3 ∉ {[Y']} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ))
i2: fresh3 ∉ {[Y']} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ)) ↔ (fresh3 ∉ {[Y']}) ∧ fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ)
i3: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ) ↔ (fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}) ∧ fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ

eval (update_svar_val X' S' (update_svar_val X S ρ)) ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦X'} = eval (update_svar_val Y' S' (update_svar_val Y S ρ)) ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦Y'}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (mu , ϕ)
HfrY: svar_is_fresh_in Y (mu , ϕ)
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
HB: (fresh3 ∉ {[X]}) ∧ fresh3 ∉ {[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ))))
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))
i0: fresh3 ∉ {[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))) ↔ (fresh3 ∉ {[Y]}) ∧ fresh3 ∉ {[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))
i1: fresh3 ∉ {[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ))) ↔ (fresh3 ∉ {[X']}) ∧ fresh3 ∉ {[Y']} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ))
i2: fresh3 ∉ {[Y']} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ)) ↔ (fresh3 ∉ {[Y']}) ∧ fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ)
i3: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ) ↔ (fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}) ∧ fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ

eval (update_svar_val X' S' (update_svar_val X S ρ)) ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦X'} = eval (update_svar_val Y' S' (update_svar_val Y S ρ)) ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦Y'}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (mu , ϕ)
HfrY: svar_is_fresh_in Y (mu , ϕ)
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
Hneqfr1: fresh3 ∉ {[X]}
HB: fresh3 ∉ {[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ))))
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))
i0: fresh3 ∉ {[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))) ↔ (fresh3 ∉ {[Y]}) ∧ fresh3 ∉ {[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))
i1: fresh3 ∉ {[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ))) ↔ (fresh3 ∉ {[X']}) ∧ fresh3 ∉ {[Y']} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ))
i2: fresh3 ∉ {[Y']} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ)) ↔ (fresh3 ∉ {[Y']}) ∧ fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ)
i3: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ) ↔ (fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}) ∧ fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ

eval (update_svar_val X' S' (update_svar_val X S ρ)) ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦X'} = eval (update_svar_val Y' S' (update_svar_val Y S ρ)) ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦Y'}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (mu , ϕ)
HfrY: svar_is_fresh_in Y (mu , ϕ)
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
Hneqfr1: fresh3 ≠ X
HB: fresh3 ∉ {[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ))))
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))
i0: fresh3 ∉ {[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))) ↔ (fresh3 ∉ {[Y]}) ∧ fresh3 ∉ {[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))
i1: fresh3 ∉ {[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ))) ↔ (fresh3 ∉ {[X']}) ∧ fresh3 ∉ {[Y']} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ))
i2: fresh3 ∉ {[Y']} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ)) ↔ (fresh3 ∉ {[Y']}) ∧ fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ)
i3: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ) ↔ (fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}) ∧ fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ

eval (update_svar_val X' S' (update_svar_val X S ρ)) ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦X'} = eval (update_svar_val Y' S' (update_svar_val Y S ρ)) ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦Y'}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (mu , ϕ)
HfrY: svar_is_fresh_in Y (mu , ϕ)
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
Hneqfr1: fresh3 ≠ X
HB: (fresh3 ∉ {[Y]}) ∧ fresh3 ∉ {[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))
i0: fresh3 ∉ {[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))) ↔ (fresh3 ∉ {[Y]}) ∧ fresh3 ∉ {[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))
i1: fresh3 ∉ {[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ))) ↔ (fresh3 ∉ {[X']}) ∧ fresh3 ∉ {[Y']} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ))
i2: fresh3 ∉ {[Y']} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ)) ↔ (fresh3 ∉ {[Y']}) ∧ fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ)
i3: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ) ↔ (fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}) ∧ fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ

eval (update_svar_val X' S' (update_svar_val X S ρ)) ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦X'} = eval (update_svar_val Y' S' (update_svar_val Y S ρ)) ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦Y'}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (mu , ϕ)
HfrY: svar_is_fresh_in Y (mu , ϕ)
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
Hneqfr1: fresh3 ≠ X
HB: (fresh3 ∉ {[Y]}) ∧ fresh3 ∉ {[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))
i1: fresh3 ∉ {[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ))) ↔ (fresh3 ∉ {[X']}) ∧ fresh3 ∉ {[Y']} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ))
i2: fresh3 ∉ {[Y']} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ)) ↔ (fresh3 ∉ {[Y']}) ∧ fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ)
i3: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ) ↔ (fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}) ∧ fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ

eval (update_svar_val X' S' (update_svar_val X S ρ)) ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦X'} = eval (update_svar_val Y' S' (update_svar_val Y S ρ)) ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦Y'}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (mu , ϕ)
HfrY: svar_is_fresh_in Y (mu , ϕ)
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
Hneqfr1: fresh3 ≠ X
Hneqfr2: fresh3 ∉ {[Y]}
HB: fresh3 ∉ {[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ)))
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))
i1: fresh3 ∉ {[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ))) ↔ (fresh3 ∉ {[X']}) ∧ fresh3 ∉ {[Y']} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ))
i2: fresh3 ∉ {[Y']} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ)) ↔ (fresh3 ∉ {[Y']}) ∧ fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ)
i3: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ) ↔ (fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}) ∧ fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ

eval (update_svar_val X' S' (update_svar_val X S ρ)) ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦X'} = eval (update_svar_val Y' S' (update_svar_val Y S ρ)) ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦Y'}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (mu , ϕ)
HfrY: svar_is_fresh_in Y (mu , ϕ)
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
Hneqfr1: fresh3 ≠ X
Hneqfr2: fresh3 ≠ Y
HB: fresh3 ∉ {[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ)))
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))
i1: fresh3 ∉ {[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ))) ↔ (fresh3 ∉ {[X']}) ∧ fresh3 ∉ {[Y']} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ))
i2: fresh3 ∉ {[Y']} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ)) ↔ (fresh3 ∉ {[Y']}) ∧ fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ)
i3: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ) ↔ (fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}) ∧ fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ

eval (update_svar_val X' S' (update_svar_val X S ρ)) ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦X'} = eval (update_svar_val Y' S' (update_svar_val Y S ρ)) ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦Y'}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (mu , ϕ)
HfrY: svar_is_fresh_in Y (mu , ϕ)
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
Hneqfr1: fresh3 ≠ X
Hneqfr2: fresh3 ≠ Y
HB: (fresh3 ∉ {[X']}) ∧ fresh3 ∉ {[Y']} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ))
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))
i1: fresh3 ∉ {[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ))) ↔ (fresh3 ∉ {[X']}) ∧ fresh3 ∉ {[Y']} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ))
i2: fresh3 ∉ {[Y']} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ)) ↔ (fresh3 ∉ {[Y']}) ∧ fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ)
i3: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ) ↔ (fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}) ∧ fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ

eval (update_svar_val X' S' (update_svar_val X S ρ)) ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦X'} = eval (update_svar_val Y' S' (update_svar_val Y S ρ)) ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦Y'}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (mu , ϕ)
HfrY: svar_is_fresh_in Y (mu , ϕ)
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
Hneqfr1: fresh3 ≠ X
Hneqfr2: fresh3 ≠ Y
HB: (fresh3 ∉ {[X']}) ∧ fresh3 ∉ {[Y']} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ))
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))
i2: fresh3 ∉ {[Y']} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ)) ↔ (fresh3 ∉ {[Y']}) ∧ fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ)
i3: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ) ↔ (fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}) ∧ fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ

eval (update_svar_val X' S' (update_svar_val X S ρ)) ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦X'} = eval (update_svar_val Y' S' (update_svar_val Y S ρ)) ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦Y'}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (mu , ϕ)
HfrY: svar_is_fresh_in Y (mu , ϕ)
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
Hneqfr1: fresh3 ≠ X
Hneqfr2: fresh3 ≠ Y
Hneqfr11: fresh3 ∉ {[X']}
HB: fresh3 ∉ {[Y']} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ))
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))
i2: fresh3 ∉ {[Y']} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ)) ↔ (fresh3 ∉ {[Y']}) ∧ fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ)
i3: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ) ↔ (fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}) ∧ fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ

eval (update_svar_val X' S' (update_svar_val X S ρ)) ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦X'} = eval (update_svar_val Y' S' (update_svar_val Y S ρ)) ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦Y'}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (mu , ϕ)
HfrY: svar_is_fresh_in Y (mu , ϕ)
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
Hneqfr1: fresh3 ≠ X
Hneqfr2: fresh3 ≠ Y
Hneqfr11: fresh3 ≠ X'
HB: fresh3 ∉ {[Y']} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ))
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))
i2: fresh3 ∉ {[Y']} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ)) ↔ (fresh3 ∉ {[Y']}) ∧ fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ)
i3: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ) ↔ (fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}) ∧ fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ

eval (update_svar_val X' S' (update_svar_val X S ρ)) ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦X'} = eval (update_svar_val Y' S' (update_svar_val Y S ρ)) ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦Y'}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (mu , ϕ)
HfrY: svar_is_fresh_in Y (mu , ϕ)
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
Hneqfr1: fresh3 ≠ X
Hneqfr2: fresh3 ≠ Y
Hneqfr11: fresh3 ≠ X'
HB: (fresh3 ∉ {[Y']}) ∧ fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ)
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))
i2: fresh3 ∉ {[Y']} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ)) ↔ (fresh3 ∉ {[Y']}) ∧ fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ)
i3: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ) ↔ (fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}) ∧ fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ

eval (update_svar_val X' S' (update_svar_val X S ρ)) ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦X'} = eval (update_svar_val Y' S' (update_svar_val Y S ρ)) ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦Y'}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (mu , ϕ)
HfrY: svar_is_fresh_in Y (mu , ϕ)
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
Hneqfr1: fresh3 ≠ X
Hneqfr2: fresh3 ≠ Y
Hneqfr11: fresh3 ≠ X'
HB: (fresh3 ∉ {[Y']}) ∧ fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ)
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))
i3: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ) ↔ (fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}) ∧ fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ

eval (update_svar_val X' S' (update_svar_val X S ρ)) ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦X'} = eval (update_svar_val Y' S' (update_svar_val Y S ρ)) ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦Y'}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (mu , ϕ)
HfrY: svar_is_fresh_in Y (mu , ϕ)
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
Hneqfr1: fresh3 ≠ X
Hneqfr2: fresh3 ≠ Y
Hneqfr11: fresh3 ≠ X'
Hneqfr22: fresh3 ∉ {[Y']}
HB: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ)
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))
i3: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ) ↔ (fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}) ∧ fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ

eval (update_svar_val X' S' (update_svar_val X S ρ)) ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦X'} = eval (update_svar_val Y' S' (update_svar_val Y S ρ)) ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦Y'}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (mu , ϕ)
HfrY: svar_is_fresh_in Y (mu , ϕ)
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
Hneqfr1: fresh3 ≠ X
Hneqfr2: fresh3 ≠ Y
Hneqfr11: fresh3 ≠ X'
Hneqfr22: fresh3 ≠ Y'
HB: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ)
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))
i3: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ) ↔ (fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}) ∧ fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ

eval (update_svar_val X' S' (update_svar_val X S ρ)) ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦X'} = eval (update_svar_val Y' S' (update_svar_val Y S ρ)) ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦Y'}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (mu , ϕ)
HfrY: svar_is_fresh_in Y (mu , ϕ)
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
Hneqfr1: fresh3 ≠ X
Hneqfr2: fresh3 ≠ Y
Hneqfr11: fresh3 ≠ X'
Hneqfr22: fresh3 ≠ Y'
HB: (fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}) ∧ fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))
i3: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ) ↔ (fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}) ∧ fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ

eval (update_svar_val X' S' (update_svar_val X S ρ)) ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦X'} = eval (update_svar_val Y' S' (update_svar_val Y S ρ)) ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦Y'}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (mu , ϕ)
HfrY: svar_is_fresh_in Y (mu , ϕ)
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
Hneqfr1: fresh3 ≠ X
Hneqfr2: fresh3 ≠ Y
Hneqfr11: fresh3 ≠ X'
Hneqfr22: fresh3 ≠ Y'
HB: (fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}) ∧ fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))

eval (update_svar_val X' S' (update_svar_val X S ρ)) ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦X'} = eval (update_svar_val Y' S' (update_svar_val Y S ρ)) ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦Y'}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (mu , ϕ)
HfrY: svar_is_fresh_in Y (mu , ϕ)
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
Hneqfr1: fresh3 ≠ X
Hneqfr2: fresh3 ≠ Y
Hneqfr11: fresh3 ≠ X'
Hneqfr22: fresh3 ≠ Y'
HnotinFree1: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}
HB: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y} ∪ free_svars ϕ
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))

eval (update_svar_val X' S' (update_svar_val X S ρ)) ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦X'} = eval (update_svar_val Y' S' (update_svar_val Y S ρ)) ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦Y'}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (mu , ϕ)
HfrY: svar_is_fresh_in Y (mu , ϕ)
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
Hneqfr1: fresh3 ≠ X
Hneqfr2: fresh3 ≠ Y
Hneqfr11: fresh3 ≠ X'
Hneqfr22: fresh3 ≠ Y'
HnotinFree1: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}
HB: (fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y}) ∧ fresh3 ∉ free_svars ϕ
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))

eval (update_svar_val X' S' (update_svar_val X S ρ)) ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦X'} = eval (update_svar_val Y' S' (update_svar_val Y S ρ)) ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦Y'}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (mu , ϕ)
HfrY: svar_is_fresh_in Y (mu , ϕ)
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
Hneqfr1: fresh3 ≠ X
Hneqfr2: fresh3 ≠ Y
Hneqfr11: fresh3 ≠ X'
Hneqfr22: fresh3 ≠ Y'
HnotinFree1: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}
HnotinFree2: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y}
HnotinFree: fresh3 ∉ free_svars ϕ
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))

eval (update_svar_val X' S' (update_svar_val X S ρ)) ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦X'} = eval (update_svar_val Y' S' (update_svar_val Y S ρ)) ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦Y'}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (mu , ϕ)
HfrY: svar_is_fresh_in Y (mu , ϕ)
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
Hneqfr1: fresh3 ≠ X
Hneqfr2: fresh3 ≠ Y
Hneqfr11: fresh3 ≠ X'
Hneqfr22: fresh3 ≠ Y'
HnotinFree1: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}
HnotinFree2: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y}
HnotinFree: fresh3 ∉ free_svars ϕ
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))

eval (update_svar_val X' S' (update_svar_val X S ρ)) ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦X'} = eval (update_svar_val Y' S' (update_svar_val Y S ρ)) ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦Y'}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (mu , ϕ)
HfrY: svar_is_fresh_in Y (mu , ϕ)
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
Hneqfr1: fresh3 ≠ X
Hneqfr2: fresh3 ≠ Y
Hneqfr11: fresh3 ≠ X'
Hneqfr22: fresh3 ≠ Y'
HnotinFree1: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}
HnotinFree2: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y}
HnotinFree: fresh3 ∉ free_svars ϕ
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))

size ϕ^{svar:Datatypes.S dbi↦X} ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (mu , ϕ)
HfrY: svar_is_fresh_in Y (mu , ϕ)
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
Hneqfr1: fresh3 ≠ X
Hneqfr2: fresh3 ≠ Y
Hneqfr11: fresh3 ≠ X'
Hneqfr22: fresh3 ≠ Y'
HnotinFree1: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}
HnotinFree2: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y}
HnotinFree: fresh3 ∉ free_svars ϕ
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))
svar_is_fresh_in X' ϕ^{svar:Datatypes.S dbi↦X}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (mu , ϕ)
HfrY: svar_is_fresh_in Y (mu , ϕ)
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
Hneqfr1: fresh3 ≠ X
Hneqfr2: fresh3 ≠ Y
Hneqfr11: fresh3 ≠ X'
Hneqfr22: fresh3 ≠ Y'
HnotinFree1: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}
HnotinFree2: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y}
HnotinFree: fresh3 ∉ free_svars ϕ
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))
svar_is_fresh_in fresh3 ϕ^{svar:Datatypes.S dbi↦X}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (mu , ϕ)
HfrY: svar_is_fresh_in Y (mu , ϕ)
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
Hneqfr1: fresh3 ≠ X
Hneqfr2: fresh3 ≠ Y
Hneqfr11: fresh3 ≠ X'
Hneqfr22: fresh3 ≠ Y'
HnotinFree1: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}
HnotinFree2: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y}
HnotinFree: fresh3 ∉ free_svars ϕ
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))
eval (update_svar_val fresh3 S' (update_svar_val X S ρ)) ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦fresh3} = eval (update_svar_val Y' S' (update_svar_val Y S ρ)) ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦Y'}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (mu , ϕ)
HfrY: svar_is_fresh_in Y (mu , ϕ)
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
Hneqfr1: fresh3 ≠ X
Hneqfr2: fresh3 ≠ Y
Hneqfr11: fresh3 ≠ X'
Hneqfr22: fresh3 ≠ Y'
HnotinFree1: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}
HnotinFree2: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y}
HnotinFree: fresh3 ∉ free_svars ϕ
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))

size ϕ ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (mu , ϕ)
HfrY: svar_is_fresh_in Y (mu , ϕ)
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
Hneqfr1: fresh3 ≠ X
Hneqfr2: fresh3 ≠ Y
Hneqfr11: fresh3 ≠ X'
Hneqfr22: fresh3 ≠ Y'
HnotinFree1: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}
HnotinFree2: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y}
HnotinFree: fresh3 ∉ free_svars ϕ
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))
svar_is_fresh_in X' ϕ^{svar:Datatypes.S dbi↦X}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (mu , ϕ)
HfrY: svar_is_fresh_in Y (mu , ϕ)
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
Hneqfr1: fresh3 ≠ X
Hneqfr2: fresh3 ≠ Y
Hneqfr11: fresh3 ≠ X'
Hneqfr22: fresh3 ≠ Y'
HnotinFree1: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}
HnotinFree2: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y}
HnotinFree: fresh3 ∉ free_svars ϕ
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))
svar_is_fresh_in fresh3 ϕ^{svar:Datatypes.S dbi↦X}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (mu , ϕ)
HfrY: svar_is_fresh_in Y (mu , ϕ)
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
Hneqfr1: fresh3 ≠ X
Hneqfr2: fresh3 ≠ Y
Hneqfr11: fresh3 ≠ X'
Hneqfr22: fresh3 ≠ Y'
HnotinFree1: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}
HnotinFree2: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y}
HnotinFree: fresh3 ∉ free_svars ϕ
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))
eval (update_svar_val fresh3 S' (update_svar_val X S ρ)) ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦fresh3} = eval (update_svar_val Y' S' (update_svar_val Y S ρ)) ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦Y'}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (mu , ϕ)
HfrY: svar_is_fresh_in Y (mu , ϕ)
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
Hneqfr1: fresh3 ≠ X
Hneqfr2: fresh3 ≠ Y
Hneqfr11: fresh3 ≠ X'
Hneqfr22: fresh3 ≠ Y'
HnotinFree1: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}
HnotinFree2: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y}
HnotinFree: fresh3 ∉ free_svars ϕ
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))

svar_is_fresh_in X' ϕ^{svar:Datatypes.S dbi↦X}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (mu , ϕ)
HfrY: svar_is_fresh_in Y (mu , ϕ)
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
Hneqfr1: fresh3 ≠ X
Hneqfr2: fresh3 ≠ Y
Hneqfr11: fresh3 ≠ X'
Hneqfr22: fresh3 ≠ Y'
HnotinFree1: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}
HnotinFree2: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y}
HnotinFree: fresh3 ∉ free_svars ϕ
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))
svar_is_fresh_in fresh3 ϕ^{svar:Datatypes.S dbi↦X}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (mu , ϕ)
HfrY: svar_is_fresh_in Y (mu , ϕ)
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
Hneqfr1: fresh3 ≠ X
Hneqfr2: fresh3 ≠ Y
Hneqfr11: fresh3 ≠ X'
Hneqfr22: fresh3 ≠ Y'
HnotinFree1: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}
HnotinFree2: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y}
HnotinFree: fresh3 ∉ free_svars ϕ
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))
eval (update_svar_val fresh3 S' (update_svar_val X S ρ)) ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦fresh3} = eval (update_svar_val Y' S' (update_svar_val Y S ρ)) ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦Y'}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (mu , ϕ)
HfrY: svar_is_fresh_in Y (mu , ϕ)
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
Hneqfr1: fresh3 ≠ X
Hneqfr2: fresh3 ≠ Y
Hneqfr11: fresh3 ≠ X'
Hneqfr22: fresh3 ≠ Y'
HnotinFree1: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}
HnotinFree2: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y}
HnotinFree: fresh3 ∉ free_svars ϕ
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))

svar_is_fresh_in (fresh_svar ϕ^{svar:Datatypes.S dbi↦X}) ϕ^{svar:Datatypes.S dbi↦X}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (mu , ϕ)
HfrY: svar_is_fresh_in Y (mu , ϕ)
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
Hneqfr1: fresh3 ≠ X
Hneqfr2: fresh3 ≠ Y
Hneqfr11: fresh3 ≠ X'
Hneqfr22: fresh3 ≠ Y'
HnotinFree1: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}
HnotinFree2: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y}
HnotinFree: fresh3 ∉ free_svars ϕ
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))
svar_is_fresh_in fresh3 ϕ^{svar:Datatypes.S dbi↦X}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (mu , ϕ)
HfrY: svar_is_fresh_in Y (mu , ϕ)
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
Hneqfr1: fresh3 ≠ X
Hneqfr2: fresh3 ≠ Y
Hneqfr11: fresh3 ≠ X'
Hneqfr22: fresh3 ≠ Y'
HnotinFree1: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}
HnotinFree2: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y}
HnotinFree: fresh3 ∉ free_svars ϕ
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))
eval (update_svar_val fresh3 S' (update_svar_val X S ρ)) ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦fresh3} = eval (update_svar_val Y' S' (update_svar_val Y S ρ)) ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦Y'}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (mu , ϕ)
HfrY: svar_is_fresh_in Y (mu , ϕ)
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
Hneqfr1: fresh3 ≠ X
Hneqfr2: fresh3 ≠ Y
Hneqfr11: fresh3 ≠ X'
Hneqfr22: fresh3 ≠ Y'
HnotinFree1: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}
HnotinFree2: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y}
HnotinFree: fresh3 ∉ free_svars ϕ
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))

svar_is_fresh_in fresh3 ϕ^{svar:Datatypes.S dbi↦X}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (mu , ϕ)
HfrY: svar_is_fresh_in Y (mu , ϕ)
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
Hneqfr1: fresh3 ≠ X
Hneqfr2: fresh3 ≠ Y
Hneqfr11: fresh3 ≠ X'
Hneqfr22: fresh3 ≠ Y'
HnotinFree1: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}
HnotinFree2: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y}
HnotinFree: fresh3 ∉ free_svars ϕ
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))
eval (update_svar_val fresh3 S' (update_svar_val X S ρ)) ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦fresh3} = eval (update_svar_val Y' S' (update_svar_val Y S ρ)) ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦Y'}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (mu , ϕ)
HfrY: svar_is_fresh_in Y (mu , ϕ)
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
Hneqfr1: fresh3 ≠ X
Hneqfr2: fresh3 ≠ Y
Hneqfr11: fresh3 ≠ X'
Hneqfr22: fresh3 ≠ Y'
HnotinFree1: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}
HnotinFree2: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y}
HnotinFree: fresh3 ∉ free_svars ϕ
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))

fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (mu , ϕ)
HfrY: svar_is_fresh_in Y (mu , ϕ)
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
Hneqfr1: fresh3 ≠ X
Hneqfr2: fresh3 ≠ Y
Hneqfr11: fresh3 ≠ X'
Hneqfr22: fresh3 ≠ Y'
HnotinFree1: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}
HnotinFree2: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y}
HnotinFree: fresh3 ∉ free_svars ϕ
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))
eval (update_svar_val fresh3 S' (update_svar_val X S ρ)) ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦fresh3} = eval (update_svar_val Y' S' (update_svar_val Y S ρ)) ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦Y'}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (mu , ϕ)
HfrY: svar_is_fresh_in Y (mu , ϕ)
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
Hneqfr1: fresh3 ≠ X
Hneqfr2: fresh3 ≠ Y
Hneqfr11: fresh3 ≠ X'
Hneqfr22: fresh3 ≠ Y'
HnotinFree1: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}
HnotinFree2: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y}
HnotinFree: fresh3 ∉ free_svars ϕ
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))

eval (update_svar_val fresh3 S' (update_svar_val X S ρ)) ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦fresh3} = eval (update_svar_val Y' S' (update_svar_val Y S ρ)) ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦Y'}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (mu , ϕ)
HfrY: svar_is_fresh_in Y (mu , ϕ)
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
Hneqfr1: fresh3 ≠ X
Hneqfr2: fresh3 ≠ Y
Hneqfr11: fresh3 ≠ X'
Hneqfr22: fresh3 ≠ Y'
HnotinFree1: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}
HnotinFree2: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y}
HnotinFree: fresh3 ∉ free_svars ϕ
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))

size ϕ^{svar:Datatypes.S dbi↦Y} ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (mu , ϕ)
HfrY: svar_is_fresh_in Y (mu , ϕ)
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
Hneqfr1: fresh3 ≠ X
Hneqfr2: fresh3 ≠ Y
Hneqfr11: fresh3 ≠ X'
Hneqfr22: fresh3 ≠ Y'
HnotinFree1: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}
HnotinFree2: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y}
HnotinFree: fresh3 ∉ free_svars ϕ
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))
svar_is_fresh_in Y' ϕ^{svar:Datatypes.S dbi↦Y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (mu , ϕ)
HfrY: svar_is_fresh_in Y (mu , ϕ)
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
Hneqfr1: fresh3 ≠ X
Hneqfr2: fresh3 ≠ Y
Hneqfr11: fresh3 ≠ X'
Hneqfr22: fresh3 ≠ Y'
HnotinFree1: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}
HnotinFree2: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y}
HnotinFree: fresh3 ∉ free_svars ϕ
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))
svar_is_fresh_in fresh3 ϕ^{svar:Datatypes.S dbi↦Y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (mu , ϕ)
HfrY: svar_is_fresh_in Y (mu , ϕ)
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
Hneqfr1: fresh3 ≠ X
Hneqfr2: fresh3 ≠ Y
Hneqfr11: fresh3 ≠ X'
Hneqfr22: fresh3 ≠ Y'
HnotinFree1: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}
HnotinFree2: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y}
HnotinFree: fresh3 ∉ free_svars ϕ
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))
eval (update_svar_val fresh3 S' (update_svar_val X S ρ)) ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦fresh3} = eval (update_svar_val fresh3 S' (update_svar_val Y S ρ)) ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦fresh3}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (mu , ϕ)
HfrY: svar_is_fresh_in Y (mu , ϕ)
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
Hneqfr1: fresh3 ≠ X
Hneqfr2: fresh3 ≠ Y
Hneqfr11: fresh3 ≠ X'
Hneqfr22: fresh3 ≠ Y'
HnotinFree1: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}
HnotinFree2: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y}
HnotinFree: fresh3 ∉ free_svars ϕ
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))

size ϕ ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (mu , ϕ)
HfrY: svar_is_fresh_in Y (mu , ϕ)
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
Hneqfr1: fresh3 ≠ X
Hneqfr2: fresh3 ≠ Y
Hneqfr11: fresh3 ≠ X'
Hneqfr22: fresh3 ≠ Y'
HnotinFree1: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}
HnotinFree2: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y}
HnotinFree: fresh3 ∉ free_svars ϕ
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))
svar_is_fresh_in Y' ϕ^{svar:Datatypes.S dbi↦Y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (mu , ϕ)
HfrY: svar_is_fresh_in Y (mu , ϕ)
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
Hneqfr1: fresh3 ≠ X
Hneqfr2: fresh3 ≠ Y
Hneqfr11: fresh3 ≠ X'
Hneqfr22: fresh3 ≠ Y'
HnotinFree1: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}
HnotinFree2: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y}
HnotinFree: fresh3 ∉ free_svars ϕ
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))
svar_is_fresh_in fresh3 ϕ^{svar:Datatypes.S dbi↦Y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (mu , ϕ)
HfrY: svar_is_fresh_in Y (mu , ϕ)
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
Hneqfr1: fresh3 ≠ X
Hneqfr2: fresh3 ≠ Y
Hneqfr11: fresh3 ≠ X'
Hneqfr22: fresh3 ≠ Y'
HnotinFree1: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}
HnotinFree2: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y}
HnotinFree: fresh3 ∉ free_svars ϕ
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))
eval (update_svar_val fresh3 S' (update_svar_val X S ρ)) ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦fresh3} = eval (update_svar_val fresh3 S' (update_svar_val Y S ρ)) ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦fresh3}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (mu , ϕ)
HfrY: svar_is_fresh_in Y (mu , ϕ)
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
Hneqfr1: fresh3 ≠ X
Hneqfr2: fresh3 ≠ Y
Hneqfr11: fresh3 ≠ X'
Hneqfr22: fresh3 ≠ Y'
HnotinFree1: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}
HnotinFree2: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y}
HnotinFree: fresh3 ∉ free_svars ϕ
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))

svar_is_fresh_in Y' ϕ^{svar:Datatypes.S dbi↦Y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (mu , ϕ)
HfrY: svar_is_fresh_in Y (mu , ϕ)
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
Hneqfr1: fresh3 ≠ X
Hneqfr2: fresh3 ≠ Y
Hneqfr11: fresh3 ≠ X'
Hneqfr22: fresh3 ≠ Y'
HnotinFree1: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}
HnotinFree2: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y}
HnotinFree: fresh3 ∉ free_svars ϕ
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))
svar_is_fresh_in fresh3 ϕ^{svar:Datatypes.S dbi↦Y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (mu , ϕ)
HfrY: svar_is_fresh_in Y (mu , ϕ)
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
Hneqfr1: fresh3 ≠ X
Hneqfr2: fresh3 ≠ Y
Hneqfr11: fresh3 ≠ X'
Hneqfr22: fresh3 ≠ Y'
HnotinFree1: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}
HnotinFree2: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y}
HnotinFree: fresh3 ∉ free_svars ϕ
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))
eval (update_svar_val fresh3 S' (update_svar_val X S ρ)) ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦fresh3} = eval (update_svar_val fresh3 S' (update_svar_val Y S ρ)) ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦fresh3}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (mu , ϕ)
HfrY: svar_is_fresh_in Y (mu , ϕ)
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
Hneqfr1: fresh3 ≠ X
Hneqfr2: fresh3 ≠ Y
Hneqfr11: fresh3 ≠ X'
Hneqfr22: fresh3 ≠ Y'
HnotinFree1: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}
HnotinFree2: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y}
HnotinFree: fresh3 ∉ free_svars ϕ
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))

svar_is_fresh_in (fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}) ϕ^{svar:Datatypes.S dbi↦Y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (mu , ϕ)
HfrY: svar_is_fresh_in Y (mu , ϕ)
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
Hneqfr1: fresh3 ≠ X
Hneqfr2: fresh3 ≠ Y
Hneqfr11: fresh3 ≠ X'
Hneqfr22: fresh3 ≠ Y'
HnotinFree1: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}
HnotinFree2: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y}
HnotinFree: fresh3 ∉ free_svars ϕ
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))
svar_is_fresh_in fresh3 ϕ^{svar:Datatypes.S dbi↦Y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (mu , ϕ)
HfrY: svar_is_fresh_in Y (mu , ϕ)
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
Hneqfr1: fresh3 ≠ X
Hneqfr2: fresh3 ≠ Y
Hneqfr11: fresh3 ≠ X'
Hneqfr22: fresh3 ≠ Y'
HnotinFree1: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}
HnotinFree2: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y}
HnotinFree: fresh3 ∉ free_svars ϕ
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))
eval (update_svar_val fresh3 S' (update_svar_val X S ρ)) ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦fresh3} = eval (update_svar_val fresh3 S' (update_svar_val Y S ρ)) ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦fresh3}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (mu , ϕ)
HfrY: svar_is_fresh_in Y (mu , ϕ)
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
Hneqfr1: fresh3 ≠ X
Hneqfr2: fresh3 ≠ Y
Hneqfr11: fresh3 ≠ X'
Hneqfr22: fresh3 ≠ Y'
HnotinFree1: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}
HnotinFree2: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y}
HnotinFree: fresh3 ∉ free_svars ϕ
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))

svar_is_fresh_in fresh3 ϕ^{svar:Datatypes.S dbi↦Y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (mu , ϕ)
HfrY: svar_is_fresh_in Y (mu , ϕ)
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
Hneqfr1: fresh3 ≠ X
Hneqfr2: fresh3 ≠ Y
Hneqfr11: fresh3 ≠ X'
Hneqfr22: fresh3 ≠ Y'
HnotinFree1: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}
HnotinFree2: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y}
HnotinFree: fresh3 ∉ free_svars ϕ
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))
eval (update_svar_val fresh3 S' (update_svar_val X S ρ)) ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦fresh3} = eval (update_svar_val fresh3 S' (update_svar_val Y S ρ)) ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦fresh3}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (mu , ϕ)
HfrY: svar_is_fresh_in Y (mu , ϕ)
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
Hneqfr1: fresh3 ≠ X
Hneqfr2: fresh3 ≠ Y
Hneqfr11: fresh3 ≠ X'
Hneqfr22: fresh3 ≠ Y'
HnotinFree1: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}
HnotinFree2: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y}
HnotinFree: fresh3 ∉ free_svars ϕ
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))

fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (mu , ϕ)
HfrY: svar_is_fresh_in Y (mu , ϕ)
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
Hneqfr1: fresh3 ≠ X
Hneqfr2: fresh3 ≠ Y
Hneqfr11: fresh3 ≠ X'
Hneqfr22: fresh3 ≠ Y'
HnotinFree1: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}
HnotinFree2: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y}
HnotinFree: fresh3 ∉ free_svars ϕ
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))
eval (update_svar_val fresh3 S' (update_svar_val X S ρ)) ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦fresh3} = eval (update_svar_val fresh3 S' (update_svar_val Y S ρ)) ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦fresh3}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (mu , ϕ)
HfrY: svar_is_fresh_in Y (mu , ϕ)
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
Hneqfr1: fresh3 ≠ X
Hneqfr2: fresh3 ≠ Y
Hneqfr11: fresh3 ≠ X'
Hneqfr22: fresh3 ≠ Y'
HnotinFree1: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}
HnotinFree2: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y}
HnotinFree: fresh3 ∉ free_svars ϕ
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))

eval (update_svar_val fresh3 S' (update_svar_val X S ρ)) ϕ^{svar:Datatypes.S dbi↦X}^{svar:0↦fresh3} = eval (update_svar_val fresh3 S' (update_svar_val Y S ρ)) ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦fresh3}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (mu , ϕ)
HfrY: svar_is_fresh_in Y (mu , ϕ)
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
Hneqfr1: fresh3 ≠ X
Hneqfr2: fresh3 ≠ Y
Hneqfr11: fresh3 ≠ X'
Hneqfr22: fresh3 ≠ Y'
HnotinFree1: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}
HnotinFree2: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y}
HnotinFree: fresh3 ∉ free_svars ϕ
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))

0 < Datatypes.S dbi
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (mu , ϕ)
HfrY: svar_is_fresh_in Y (mu , ϕ)
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
Hneqfr1: fresh3 ≠ X
Hneqfr2: fresh3 ≠ Y
Hneqfr11: fresh3 ≠ X'
Hneqfr22: fresh3 ≠ Y'
HnotinFree1: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}
HnotinFree2: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y}
HnotinFree: fresh3 ∉ free_svars ϕ
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))
eval (update_svar_val fresh3 S' (update_svar_val X S ρ)) ϕ^{svar:0↦fresh3}^{svar: Init.Nat.pred (Datatypes.S dbi)↦X} = eval (update_svar_val fresh3 S' (update_svar_val Y S ρ)) ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦fresh3}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (mu , ϕ)
HfrY: svar_is_fresh_in Y (mu , ϕ)
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
Hneqfr1: fresh3 ≠ X
Hneqfr2: fresh3 ≠ Y
Hneqfr11: fresh3 ≠ X'
Hneqfr22: fresh3 ≠ Y'
HnotinFree1: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}
HnotinFree2: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y}
HnotinFree: fresh3 ∉ free_svars ϕ
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))

eval (update_svar_val fresh3 S' (update_svar_val X S ρ)) ϕ^{svar:0↦fresh3}^{svar:Init.Nat.pred (Datatypes.S dbi)↦X} = eval (update_svar_val fresh3 S' (update_svar_val Y S ρ)) ϕ^{svar:Datatypes.S dbi↦Y}^{svar:0↦fresh3}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (mu , ϕ)
HfrY: svar_is_fresh_in Y (mu , ϕ)
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
Hneqfr1: fresh3 ≠ X
Hneqfr2: fresh3 ≠ Y
Hneqfr11: fresh3 ≠ X'
Hneqfr22: fresh3 ≠ Y'
HnotinFree1: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}
HnotinFree2: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y}
HnotinFree: fresh3 ∉ free_svars ϕ
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))

0 < Datatypes.S dbi
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (mu , ϕ)
HfrY: svar_is_fresh_in Y (mu , ϕ)
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
Hneqfr1: fresh3 ≠ X
Hneqfr2: fresh3 ≠ Y
Hneqfr11: fresh3 ≠ X'
Hneqfr22: fresh3 ≠ Y'
HnotinFree1: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}
HnotinFree2: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y}
HnotinFree: fresh3 ∉ free_svars ϕ
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))
eval (update_svar_val fresh3 S' (update_svar_val X S ρ)) ϕ^{svar:0↦fresh3}^{svar: Init.Nat.pred (Datatypes.S dbi)↦X} = eval (update_svar_val fresh3 S' (update_svar_val Y S ρ)) ϕ^{svar:0↦fresh3}^{svar: Init.Nat.pred (Datatypes.S dbi)↦Y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (mu , ϕ)
HfrY: svar_is_fresh_in Y (mu , ϕ)
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
Hneqfr1: fresh3 ≠ X
Hneqfr2: fresh3 ≠ Y
Hneqfr11: fresh3 ≠ X'
Hneqfr22: fresh3 ≠ Y'
HnotinFree1: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}
HnotinFree2: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y}
HnotinFree: fresh3 ∉ free_svars ϕ
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))

eval (update_svar_val fresh3 S' (update_svar_val X S ρ)) ϕ^{svar:0↦fresh3}^{svar:Init.Nat.pred (Datatypes.S dbi)↦X} = eval (update_svar_val fresh3 S' (update_svar_val Y S ρ)) ϕ^{svar:0↦fresh3}^{svar:Init.Nat.pred (Datatypes.S dbi)↦Y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (mu , ϕ)
HfrY: svar_is_fresh_in Y (mu , ϕ)
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
Hneqfr1: fresh3 ≠ X
Hneqfr2: fresh3 ≠ Y
Hneqfr11: fresh3 ≠ X'
Hneqfr22: fresh3 ≠ Y'
HnotinFree1: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}
HnotinFree2: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y}
HnotinFree: fresh3 ∉ free_svars ϕ
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))

eval (update_svar_val fresh3 S' (update_svar_val X S ρ)) ϕ^{svar:0↦fresh3}^{svar:dbi↦X} = eval (update_svar_val fresh3 S' (update_svar_val Y S ρ)) ϕ^{svar:0↦fresh3}^{svar:dbi↦Y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (mu , ϕ)
HfrY: svar_is_fresh_in Y (mu , ϕ)
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
Hneqfr1: fresh3 ≠ X
Hneqfr2: fresh3 ≠ Y
Hneqfr11: fresh3 ≠ X'
Hneqfr22: fresh3 ≠ Y'
HnotinFree1: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}
HnotinFree2: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y}
HnotinFree: fresh3 ∉ free_svars ϕ
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))

fresh3 ≠ X
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (mu , ϕ)
HfrY: svar_is_fresh_in Y (mu , ϕ)
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
Hneqfr1: fresh3 ≠ X
Hneqfr2: fresh3 ≠ Y
Hneqfr11: fresh3 ≠ X'
Hneqfr22: fresh3 ≠ Y'
HnotinFree1: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}
HnotinFree2: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y}
HnotinFree: fresh3 ∉ free_svars ϕ
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))
eval (update_svar_val X S (update_svar_val fresh3 S' ρ)) ϕ^{svar:0↦fresh3}^{svar:dbi↦X} = eval (update_svar_val fresh3 S' (update_svar_val Y S ρ)) ϕ^{svar:0↦fresh3}^{svar:dbi↦Y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (mu , ϕ)
HfrY: svar_is_fresh_in Y (mu , ϕ)
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
Hneqfr1: fresh3 ≠ X
Hneqfr2: fresh3 ≠ Y
Hneqfr11: fresh3 ≠ X'
Hneqfr22: fresh3 ≠ Y'
HnotinFree1: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}
HnotinFree2: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y}
HnotinFree: fresh3 ∉ free_svars ϕ
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))

eval (update_svar_val X S (update_svar_val fresh3 S' ρ)) ϕ^{svar:0↦fresh3}^{svar:dbi↦X} = eval (update_svar_val fresh3 S' (update_svar_val Y S ρ)) ϕ^{svar:0↦fresh3}^{svar:dbi↦Y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (mu , ϕ)
HfrY: svar_is_fresh_in Y (mu , ϕ)
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
Hneqfr1: fresh3 ≠ X
Hneqfr2: fresh3 ≠ Y
Hneqfr11: fresh3 ≠ X'
Hneqfr22: fresh3 ≠ Y'
HnotinFree1: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}
HnotinFree2: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y}
HnotinFree: fresh3 ∉ free_svars ϕ
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))

fresh3 ≠ Y
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (mu , ϕ)
HfrY: svar_is_fresh_in Y (mu , ϕ)
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
Hneqfr1: fresh3 ≠ X
Hneqfr2: fresh3 ≠ Y
Hneqfr11: fresh3 ≠ X'
Hneqfr22: fresh3 ≠ Y'
HnotinFree1: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}
HnotinFree2: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y}
HnotinFree: fresh3 ∉ free_svars ϕ
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))
eval (update_svar_val X S (update_svar_val fresh3 S' ρ)) ϕ^{svar:0↦fresh3}^{svar:dbi↦X} = eval (update_svar_val Y S (update_svar_val fresh3 S' ρ)) ϕ^{svar:0↦fresh3}^{svar:dbi↦Y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (mu , ϕ)
HfrY: svar_is_fresh_in Y (mu , ϕ)
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
Hneqfr1: fresh3 ≠ X
Hneqfr2: fresh3 ≠ Y
Hneqfr11: fresh3 ≠ X'
Hneqfr22: fresh3 ≠ Y'
HnotinFree1: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}
HnotinFree2: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y}
HnotinFree: fresh3 ∉ free_svars ϕ
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))

eval (update_svar_val X S (update_svar_val fresh3 S' ρ)) ϕ^{svar:0↦fresh3}^{svar:dbi↦X} = eval (update_svar_val Y S (update_svar_val fresh3 S' ρ)) ϕ^{svar:0↦fresh3}^{svar:dbi↦Y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ex , (mu , ϕ))
HfrY: svar_is_fresh_in Y (mu , ϕ)
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
Hneqfr1: fresh3 ≠ X
Hneqfr2: fresh3 ≠ Y
Hneqfr11: fresh3 ≠ X'
Hneqfr22: fresh3 ≠ Y'
HnotinFree1: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}
HnotinFree2: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y}
HnotinFree: fresh3 ∉ free_svars ϕ
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))

eval (update_svar_val X S (update_svar_val fresh3 S' ρ)) ϕ^{svar:0↦fresh3}^{svar:dbi↦X} = eval (update_svar_val Y S (update_svar_val fresh3 S' ρ)) ϕ^{svar:0↦fresh3}^{svar:dbi↦Y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ex , (mu , ϕ))
HfrY: svar_is_fresh_in Y (ex , (mu , ϕ))
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
Hneqfr1: fresh3 ≠ X
Hneqfr2: fresh3 ≠ Y
Hneqfr11: fresh3 ≠ X'
Hneqfr22: fresh3 ≠ Y'
HnotinFree1: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}
HnotinFree2: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y}
HnotinFree: fresh3 ∉ free_svars ϕ
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))

eval (update_svar_val X S (update_svar_val fresh3 S' ρ)) ϕ^{svar:0↦fresh3}^{svar:dbi↦X} = eval (update_svar_val Y S (update_svar_val fresh3 S' ρ)) ϕ^{svar:0↦fresh3}^{svar:dbi↦Y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ex , (mu , ϕ))
HfrY: svar_is_fresh_in Y (ex , (mu , ϕ))
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
Hneqfr1: fresh3 ≠ X
Hneqfr2: fresh3 ≠ Y
Hneqfr11: fresh3 ≠ X'
Hneqfr22: fresh3 ≠ Y'
HnotinFree1: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}
HnotinFree2: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y}
HnotinFree: fresh3 ∉ free_svars ϕ
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))

size ϕ^{svar:0↦fresh3} ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ex , (mu , ϕ))
HfrY: svar_is_fresh_in Y (ex , (mu , ϕ))
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
Hneqfr1: fresh3 ≠ X
Hneqfr2: fresh3 ≠ Y
Hneqfr11: fresh3 ≠ X'
Hneqfr22: fresh3 ≠ Y'
HnotinFree1: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}
HnotinFree2: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y}
HnotinFree: fresh3 ∉ free_svars ϕ
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))
svar_is_fresh_in X ϕ^{svar:0↦fresh3}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ex , (mu , ϕ))
HfrY: svar_is_fresh_in Y (ex , (mu , ϕ))
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
Hneqfr1: fresh3 ≠ X
Hneqfr2: fresh3 ≠ Y
Hneqfr11: fresh3 ≠ X'
Hneqfr22: fresh3 ≠ Y'
HnotinFree1: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}
HnotinFree2: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y}
HnotinFree: fresh3 ∉ free_svars ϕ
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))
svar_is_fresh_in Y ϕ^{svar:0↦fresh3}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ex , (mu , ϕ))
HfrY: svar_is_fresh_in Y (ex , (mu , ϕ))
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
Hneqfr1: fresh3 ≠ X
Hneqfr2: fresh3 ≠ Y
Hneqfr11: fresh3 ≠ X'
Hneqfr22: fresh3 ≠ Y'
HnotinFree1: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}
HnotinFree2: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y}
HnotinFree: fresh3 ∉ free_svars ϕ
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))
eval (update_svar_val Y S (update_svar_val fresh3 S' ρ)) ϕ^{svar:0↦fresh3}^{svar:dbi↦Y} = eval (update_svar_val Y S (update_svar_val fresh3 S' ρ)) ϕ^{svar:0↦fresh3}^{svar:dbi↦Y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ex , (mu , ϕ))
HfrY: svar_is_fresh_in Y (ex , (mu , ϕ))
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
Hneqfr1: fresh3 ≠ X
Hneqfr2: fresh3 ≠ Y
Hneqfr11: fresh3 ≠ X'
Hneqfr22: fresh3 ≠ Y'
HnotinFree1: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}
HnotinFree2: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y}
HnotinFree: fresh3 ∉ free_svars ϕ
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))

size ϕ ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ex , (mu , ϕ))
HfrY: svar_is_fresh_in Y (ex , (mu , ϕ))
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
Hneqfr1: fresh3 ≠ X
Hneqfr2: fresh3 ≠ Y
Hneqfr11: fresh3 ≠ X'
Hneqfr22: fresh3 ≠ Y'
HnotinFree1: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}
HnotinFree2: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y}
HnotinFree: fresh3 ∉ free_svars ϕ
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))
svar_is_fresh_in X ϕ^{svar:0↦fresh3}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ex , (mu , ϕ))
HfrY: svar_is_fresh_in Y (ex , (mu , ϕ))
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
Hneqfr1: fresh3 ≠ X
Hneqfr2: fresh3 ≠ Y
Hneqfr11: fresh3 ≠ X'
Hneqfr22: fresh3 ≠ Y'
HnotinFree1: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}
HnotinFree2: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y}
HnotinFree: fresh3 ∉ free_svars ϕ
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))
svar_is_fresh_in Y ϕ^{svar:0↦fresh3}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ex , (mu , ϕ))
HfrY: svar_is_fresh_in Y (ex , (mu , ϕ))
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
Hneqfr1: fresh3 ≠ X
Hneqfr2: fresh3 ≠ Y
Hneqfr11: fresh3 ≠ X'
Hneqfr22: fresh3 ≠ Y'
HnotinFree1: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}
HnotinFree2: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y}
HnotinFree: fresh3 ∉ free_svars ϕ
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))
eval (update_svar_val Y S (update_svar_val fresh3 S' ρ)) ϕ^{svar:0↦fresh3}^{svar:dbi↦Y} = eval (update_svar_val Y S (update_svar_val fresh3 S' ρ)) ϕ^{svar:0↦fresh3}^{svar:dbi↦Y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ex , (mu , ϕ))
HfrY: svar_is_fresh_in Y (ex , (mu , ϕ))
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
Hneqfr1: fresh3 ≠ X
Hneqfr2: fresh3 ≠ Y
Hneqfr11: fresh3 ≠ X'
Hneqfr22: fresh3 ≠ Y'
HnotinFree1: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}
HnotinFree2: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y}
HnotinFree: fresh3 ∉ free_svars ϕ
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))

svar_is_fresh_in X ϕ^{svar:0↦fresh3}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ex , (mu , ϕ))
HfrY: svar_is_fresh_in Y (ex , (mu , ϕ))
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
Hneqfr1: fresh3 ≠ X
Hneqfr2: fresh3 ≠ Y
Hneqfr11: fresh3 ≠ X'
Hneqfr22: fresh3 ≠ Y'
HnotinFree1: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}
HnotinFree2: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y}
HnotinFree: fresh3 ∉ free_svars ϕ
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))
svar_is_fresh_in Y ϕ^{svar:0↦fresh3}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ex , (mu , ϕ))
HfrY: svar_is_fresh_in Y (ex , (mu , ϕ))
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
Hneqfr1: fresh3 ≠ X
Hneqfr2: fresh3 ≠ Y
Hneqfr11: fresh3 ≠ X'
Hneqfr22: fresh3 ≠ Y'
HnotinFree1: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}
HnotinFree2: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y}
HnotinFree: fresh3 ∉ free_svars ϕ
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))
eval (update_svar_val Y S (update_svar_val fresh3 S' ρ)) ϕ^{svar:0↦fresh3}^{svar:dbi↦Y} = eval (update_svar_val Y S (update_svar_val fresh3 S' ρ)) ϕ^{svar:0↦fresh3}^{svar:dbi↦Y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ex , (mu , ϕ))
HfrY: svar_is_fresh_in Y (ex , (mu , ϕ))
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
Hneqfr1: fresh3 ≠ X
Hneqfr2: fresh3 ≠ Y
Hneqfr11: fresh3 ≠ X'
Hneqfr22: fresh3 ≠ Y'
HnotinFree1: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}
HnotinFree2: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y}
HnotinFree: fresh3 ∉ free_svars ϕ
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))

X ∉ free_svars ϕ^{svar:0↦fresh3}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ex , (mu , ϕ))
HfrY: svar_is_fresh_in Y (ex , (mu , ϕ))
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
Hneqfr1: fresh3 ≠ X
Hneqfr2: fresh3 ≠ Y
Hneqfr11: fresh3 ≠ X'
Hneqfr22: fresh3 ≠ Y'
HnotinFree1: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}
HnotinFree2: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y}
HnotinFree: fresh3 ∉ free_svars ϕ
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))
svar_is_fresh_in Y ϕ^{svar:0↦fresh3}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ex , (mu , ϕ))
HfrY: svar_is_fresh_in Y (ex , (mu , ϕ))
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
Hneqfr1: fresh3 ≠ X
Hneqfr2: fresh3 ≠ Y
Hneqfr11: fresh3 ≠ X'
Hneqfr22: fresh3 ≠ Y'
HnotinFree1: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}
HnotinFree2: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y}
HnotinFree: fresh3 ∉ free_svars ϕ
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))
eval (update_svar_val Y S (update_svar_val fresh3 S' ρ)) ϕ^{svar:0↦fresh3}^{svar:dbi↦Y} = eval (update_svar_val Y S (update_svar_val fresh3 S' ρ)) ϕ^{svar:0↦fresh3}^{svar:dbi↦Y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ex , (mu , ϕ))
HfrY: svar_is_fresh_in Y (ex , (mu , ϕ))
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
Hneqfr1: fresh3 ≠ X
Hneqfr2: fresh3 ≠ Y
Hneqfr11: fresh3 ≠ X'
Hneqfr22: fresh3 ≠ Y'
HnotinFree1: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}
HnotinFree2: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y}
HnotinFree: fresh3 ∉ free_svars ϕ
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))

X ∉ free_svars ϕ
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ex , (mu , ϕ))
HfrY: svar_is_fresh_in Y (ex , (mu , ϕ))
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
Hneqfr1: fresh3 ≠ X
Hneqfr2: fresh3 ≠ Y
Hneqfr11: fresh3 ≠ X'
Hneqfr22: fresh3 ≠ Y'
HnotinFree1: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}
HnotinFree2: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y}
HnotinFree: fresh3 ∉ free_svars ϕ
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))
fresh3 ∉ free_svars ϕ
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ex , (mu , ϕ))
HfrY: svar_is_fresh_in Y (ex , (mu , ϕ))
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
Hneqfr1: fresh3 ≠ X
Hneqfr2: fresh3 ≠ Y
Hneqfr11: fresh3 ≠ X'
Hneqfr22: fresh3 ≠ Y'
HnotinFree1: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}
HnotinFree2: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y}
HnotinFree: fresh3 ∉ free_svars ϕ
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))
X ≠ fresh3
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ex , (mu , ϕ))
HfrY: svar_is_fresh_in Y (ex , (mu , ϕ))
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
Hneqfr1: fresh3 ≠ X
Hneqfr2: fresh3 ≠ Y
Hneqfr11: fresh3 ≠ X'
Hneqfr22: fresh3 ≠ Y'
HnotinFree1: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}
HnotinFree2: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y}
HnotinFree: fresh3 ∉ free_svars ϕ
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))
svar_is_fresh_in Y ϕ^{svar:0↦fresh3}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ex , (mu , ϕ))
HfrY: svar_is_fresh_in Y (ex , (mu , ϕ))
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
Hneqfr1: fresh3 ≠ X
Hneqfr2: fresh3 ≠ Y
Hneqfr11: fresh3 ≠ X'
Hneqfr22: fresh3 ≠ Y'
HnotinFree1: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}
HnotinFree2: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y}
HnotinFree: fresh3 ∉ free_svars ϕ
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))
eval (update_svar_val Y S (update_svar_val fresh3 S' ρ)) ϕ^{svar:0↦fresh3}^{svar:dbi↦Y} = eval (update_svar_val Y S (update_svar_val fresh3 S' ρ)) ϕ^{svar:0↦fresh3}^{svar:dbi↦Y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ex , (mu , ϕ))
HfrY: svar_is_fresh_in Y (ex , (mu , ϕ))
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
Hneqfr1: fresh3 ≠ X
Hneqfr2: fresh3 ≠ Y
Hneqfr11: fresh3 ≠ X'
Hneqfr22: fresh3 ≠ Y'
HnotinFree1: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}
HnotinFree2: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y}
HnotinFree: fresh3 ∉ free_svars ϕ
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))

fresh3 ∉ free_svars ϕ
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ex , (mu , ϕ))
HfrY: svar_is_fresh_in Y (ex , (mu , ϕ))
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
Hneqfr1: fresh3 ≠ X
Hneqfr2: fresh3 ≠ Y
Hneqfr11: fresh3 ≠ X'
Hneqfr22: fresh3 ≠ Y'
HnotinFree1: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}
HnotinFree2: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y}
HnotinFree: fresh3 ∉ free_svars ϕ
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))
X ≠ fresh3
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ex , (mu , ϕ))
HfrY: svar_is_fresh_in Y (ex , (mu , ϕ))
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
Hneqfr1: fresh3 ≠ X
Hneqfr2: fresh3 ≠ Y
Hneqfr11: fresh3 ≠ X'
Hneqfr22: fresh3 ≠ Y'
HnotinFree1: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}
HnotinFree2: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y}
HnotinFree: fresh3 ∉ free_svars ϕ
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))
svar_is_fresh_in Y ϕ^{svar:0↦fresh3}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ex , (mu , ϕ))
HfrY: svar_is_fresh_in Y (ex , (mu , ϕ))
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
Hneqfr1: fresh3 ≠ X
Hneqfr2: fresh3 ≠ Y
Hneqfr11: fresh3 ≠ X'
Hneqfr22: fresh3 ≠ Y'
HnotinFree1: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}
HnotinFree2: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y}
HnotinFree: fresh3 ∉ free_svars ϕ
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))
eval (update_svar_val Y S (update_svar_val fresh3 S' ρ)) ϕ^{svar:0↦fresh3}^{svar:dbi↦Y} = eval (update_svar_val Y S (update_svar_val fresh3 S' ρ)) ϕ^{svar:0↦fresh3}^{svar:dbi↦Y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ex , (mu , ϕ))
HfrY: svar_is_fresh_in Y (ex , (mu , ϕ))
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
Hneqfr1: fresh3 ≠ X
Hneqfr2: fresh3 ≠ Y
Hneqfr11: fresh3 ≠ X'
Hneqfr22: fresh3 ≠ Y'
HnotinFree1: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}
HnotinFree2: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y}
HnotinFree: fresh3 ∉ free_svars ϕ
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))

X ≠ fresh3
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ex , (mu , ϕ))
HfrY: svar_is_fresh_in Y (ex , (mu , ϕ))
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
Hneqfr1: fresh3 ≠ X
Hneqfr2: fresh3 ≠ Y
Hneqfr11: fresh3 ≠ X'
Hneqfr22: fresh3 ≠ Y'
HnotinFree1: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}
HnotinFree2: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y}
HnotinFree: fresh3 ∉ free_svars ϕ
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))
svar_is_fresh_in Y ϕ^{svar:0↦fresh3}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ex , (mu , ϕ))
HfrY: svar_is_fresh_in Y (ex , (mu , ϕ))
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
Hneqfr1: fresh3 ≠ X
Hneqfr2: fresh3 ≠ Y
Hneqfr11: fresh3 ≠ X'
Hneqfr22: fresh3 ≠ Y'
HnotinFree1: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}
HnotinFree2: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y}
HnotinFree: fresh3 ∉ free_svars ϕ
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))
eval (update_svar_val Y S (update_svar_val fresh3 S' ρ)) ϕ^{svar:0↦fresh3}^{svar:dbi↦Y} = eval (update_svar_val Y S (update_svar_val fresh3 S' ρ)) ϕ^{svar:0↦fresh3}^{svar:dbi↦Y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ex , (mu , ϕ))
HfrY: svar_is_fresh_in Y (ex , (mu , ϕ))
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
Hneqfr1: fresh3 ≠ X
Hneqfr2: fresh3 ≠ Y
Hneqfr11: fresh3 ≠ X'
Hneqfr22: fresh3 ≠ Y'
HnotinFree1: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}
HnotinFree2: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y}
HnotinFree: fresh3 ∉ free_svars ϕ
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))
Contra: X = fresh3

False
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ex , (mu , ϕ))
HfrY: svar_is_fresh_in Y (ex , (mu , ϕ))
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
Hneqfr1: fresh3 ≠ X
Hneqfr2: fresh3 ≠ Y
Hneqfr11: fresh3 ≠ X'
Hneqfr22: fresh3 ≠ Y'
HnotinFree1: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}
HnotinFree2: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y}
HnotinFree: fresh3 ∉ free_svars ϕ
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))
svar_is_fresh_in Y ϕ^{svar:0↦fresh3}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ex , (mu , ϕ))
HfrY: svar_is_fresh_in Y (ex , (mu , ϕ))
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
Hneqfr1: fresh3 ≠ X
Hneqfr2: fresh3 ≠ Y
Hneqfr11: fresh3 ≠ X'
Hneqfr22: fresh3 ≠ Y'
HnotinFree1: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}
HnotinFree2: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y}
HnotinFree: fresh3 ∉ free_svars ϕ
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))
eval (update_svar_val Y S (update_svar_val fresh3 S' ρ)) ϕ^{svar:0↦fresh3}^{svar:dbi↦Y} = eval (update_svar_val Y S (update_svar_val fresh3 S' ρ)) ϕ^{svar:0↦fresh3}^{svar:dbi↦Y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ex , (mu , ϕ))
HfrY: svar_is_fresh_in Y (ex , (mu , ϕ))
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
Hneqfr1: fresh3 ≠ X
Hneqfr2: fresh3 ≠ Y
Hneqfr11: fresh3 ≠ X'
Hneqfr22: fresh3 ≠ Y'
HnotinFree1: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}
HnotinFree2: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y}
HnotinFree: fresh3 ∉ free_svars ϕ
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))
Contra: fresh3 = X

False
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ex , (mu , ϕ))
HfrY: svar_is_fresh_in Y (ex , (mu , ϕ))
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
Hneqfr1: fresh3 ≠ X
Hneqfr2: fresh3 ≠ Y
Hneqfr11: fresh3 ≠ X'
Hneqfr22: fresh3 ≠ Y'
HnotinFree1: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}
HnotinFree2: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y}
HnotinFree: fresh3 ∉ free_svars ϕ
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))
svar_is_fresh_in Y ϕ^{svar:0↦fresh3}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ex , (mu , ϕ))
HfrY: svar_is_fresh_in Y (ex , (mu , ϕ))
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
Hneqfr1: fresh3 ≠ X
Hneqfr2: fresh3 ≠ Y
Hneqfr11: fresh3 ≠ X'
Hneqfr22: fresh3 ≠ Y'
HnotinFree1: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}
HnotinFree2: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y}
HnotinFree: fresh3 ∉ free_svars ϕ
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))
eval (update_svar_val Y S (update_svar_val fresh3 S' ρ)) ϕ^{svar:0↦fresh3}^{svar:dbi↦Y} = eval (update_svar_val Y S (update_svar_val fresh3 S' ρ)) ϕ^{svar:0↦fresh3}^{svar:dbi↦Y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ex , (mu , ϕ))
HfrY: svar_is_fresh_in Y (ex , (mu , ϕ))
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
Hneqfr1: fresh3 ≠ X
Hneqfr2: fresh3 ≠ Y
Hneqfr11: fresh3 ≠ X'
Hneqfr22: fresh3 ≠ Y'
HnotinFree1: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}
HnotinFree2: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y}
HnotinFree: fresh3 ∉ free_svars ϕ
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))

svar_is_fresh_in Y ϕ^{svar:0↦fresh3}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ex , (mu , ϕ))
HfrY: svar_is_fresh_in Y (ex , (mu , ϕ))
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
Hneqfr1: fresh3 ≠ X
Hneqfr2: fresh3 ≠ Y
Hneqfr11: fresh3 ≠ X'
Hneqfr22: fresh3 ≠ Y'
HnotinFree1: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}
HnotinFree2: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y}
HnotinFree: fresh3 ∉ free_svars ϕ
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))
eval (update_svar_val Y S (update_svar_val fresh3 S' ρ)) ϕ^{svar:0↦fresh3}^{svar:dbi↦Y} = eval (update_svar_val Y S (update_svar_val fresh3 S' ρ)) ϕ^{svar:0↦fresh3}^{svar:dbi↦Y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ex , (mu , ϕ))
HfrY: svar_is_fresh_in Y (ex , (mu , ϕ))
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
Hneqfr1: fresh3 ≠ X
Hneqfr2: fresh3 ≠ Y
Hneqfr11: fresh3 ≠ X'
Hneqfr22: fresh3 ≠ Y'
HnotinFree1: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}
HnotinFree2: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y}
HnotinFree: fresh3 ∉ free_svars ϕ
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))

Y ∉ free_svars ϕ
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ex , (mu , ϕ))
HfrY: svar_is_fresh_in Y (ex , (mu , ϕ))
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
Hneqfr1: fresh3 ≠ X
Hneqfr2: fresh3 ≠ Y
Hneqfr11: fresh3 ≠ X'
Hneqfr22: fresh3 ≠ Y'
HnotinFree1: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}
HnotinFree2: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y}
HnotinFree: fresh3 ∉ free_svars ϕ
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))
fresh3 ∉ free_svars ϕ
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ex , (mu , ϕ))
HfrY: svar_is_fresh_in Y (ex , (mu , ϕ))
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
Hneqfr1: fresh3 ≠ X
Hneqfr2: fresh3 ≠ Y
Hneqfr11: fresh3 ≠ X'
Hneqfr22: fresh3 ≠ Y'
HnotinFree1: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}
HnotinFree2: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y}
HnotinFree: fresh3 ∉ free_svars ϕ
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))
Y ≠ fresh3
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ex , (mu , ϕ))
HfrY: svar_is_fresh_in Y (ex , (mu , ϕ))
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
Hneqfr1: fresh3 ≠ X
Hneqfr2: fresh3 ≠ Y
Hneqfr11: fresh3 ≠ X'
Hneqfr22: fresh3 ≠ Y'
HnotinFree1: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}
HnotinFree2: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y}
HnotinFree: fresh3 ∉ free_svars ϕ
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))
eval (update_svar_val Y S (update_svar_val fresh3 S' ρ)) ϕ^{svar:0↦fresh3}^{svar:dbi↦Y} = eval (update_svar_val Y S (update_svar_val fresh3 S' ρ)) ϕ^{svar:0↦fresh3}^{svar:dbi↦Y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ex , (mu , ϕ))
HfrY: svar_is_fresh_in Y (ex , (mu , ϕ))
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
Hneqfr1: fresh3 ≠ X
Hneqfr2: fresh3 ≠ Y
Hneqfr11: fresh3 ≠ X'
Hneqfr22: fresh3 ≠ Y'
HnotinFree1: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}
HnotinFree2: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y}
HnotinFree: fresh3 ∉ free_svars ϕ
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))

fresh3 ∉ free_svars ϕ
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ex , (mu , ϕ))
HfrY: svar_is_fresh_in Y (ex , (mu , ϕ))
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
Hneqfr1: fresh3 ≠ X
Hneqfr2: fresh3 ≠ Y
Hneqfr11: fresh3 ≠ X'
Hneqfr22: fresh3 ≠ Y'
HnotinFree1: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}
HnotinFree2: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y}
HnotinFree: fresh3 ∉ free_svars ϕ
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))
Y ≠ fresh3
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ex , (mu , ϕ))
HfrY: svar_is_fresh_in Y (ex , (mu , ϕ))
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
Hneqfr1: fresh3 ≠ X
Hneqfr2: fresh3 ≠ Y
Hneqfr11: fresh3 ≠ X'
Hneqfr22: fresh3 ≠ Y'
HnotinFree1: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}
HnotinFree2: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y}
HnotinFree: fresh3 ∉ free_svars ϕ
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))
eval (update_svar_val Y S (update_svar_val fresh3 S' ρ)) ϕ^{svar:0↦fresh3}^{svar:dbi↦Y} = eval (update_svar_val Y S (update_svar_val fresh3 S' ρ)) ϕ^{svar:0↦fresh3}^{svar:dbi↦Y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ex , (mu , ϕ))
HfrY: svar_is_fresh_in Y (ex , (mu , ϕ))
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
Hneqfr1: fresh3 ≠ X
Hneqfr2: fresh3 ≠ Y
Hneqfr11: fresh3 ≠ X'
Hneqfr22: fresh3 ≠ Y'
HnotinFree1: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}
HnotinFree2: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y}
HnotinFree: fresh3 ∉ free_svars ϕ
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))

Y ≠ fresh3
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ex , (mu , ϕ))
HfrY: svar_is_fresh_in Y (ex , (mu , ϕ))
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
Hneqfr1: fresh3 ≠ X
Hneqfr2: fresh3 ≠ Y
Hneqfr11: fresh3 ≠ X'
Hneqfr22: fresh3 ≠ Y'
HnotinFree1: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}
HnotinFree2: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y}
HnotinFree: fresh3 ∉ free_svars ϕ
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))
eval (update_svar_val Y S (update_svar_val fresh3 S' ρ)) ϕ^{svar:0↦fresh3}^{svar:dbi↦Y} = eval (update_svar_val Y S (update_svar_val fresh3 S' ρ)) ϕ^{svar:0↦fresh3}^{svar:dbi↦Y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ex , (mu , ϕ))
HfrY: svar_is_fresh_in Y (ex , (mu , ϕ))
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
Hneqfr1: fresh3 ≠ X
Hneqfr2: fresh3 ≠ Y
Hneqfr11: fresh3 ≠ X'
Hneqfr22: fresh3 ≠ Y'
HnotinFree1: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}
HnotinFree2: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y}
HnotinFree: fresh3 ∉ free_svars ϕ
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))
Contra: Y = fresh3

False
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ex , (mu , ϕ))
HfrY: svar_is_fresh_in Y (ex , (mu , ϕ))
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
Hneqfr1: fresh3 ≠ X
Hneqfr2: fresh3 ≠ Y
Hneqfr11: fresh3 ≠ X'
Hneqfr22: fresh3 ≠ Y'
HnotinFree1: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}
HnotinFree2: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y}
HnotinFree: fresh3 ∉ free_svars ϕ
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))
eval (update_svar_val Y S (update_svar_val fresh3 S' ρ)) ϕ^{svar:0↦fresh3}^{svar:dbi↦Y} = eval (update_svar_val Y S (update_svar_val fresh3 S' ρ)) ϕ^{svar:0↦fresh3}^{svar:dbi↦Y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ex , (mu , ϕ))
HfrY: svar_is_fresh_in Y (ex , (mu , ϕ))
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
Hneqfr1: fresh3 ≠ X
Hneqfr2: fresh3 ≠ Y
Hneqfr11: fresh3 ≠ X'
Hneqfr22: fresh3 ≠ Y'
HnotinFree1: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}
HnotinFree2: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y}
HnotinFree: fresh3 ∉ free_svars ϕ
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))
Contra: fresh3 = Y

False
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ex , (mu , ϕ))
HfrY: svar_is_fresh_in Y (ex , (mu , ϕ))
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
Hneqfr1: fresh3 ≠ X
Hneqfr2: fresh3 ≠ Y
Hneqfr11: fresh3 ≠ X'
Hneqfr22: fresh3 ≠ Y'
HnotinFree1: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}
HnotinFree2: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y}
HnotinFree: fresh3 ∉ free_svars ϕ
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))
eval (update_svar_val Y S (update_svar_val fresh3 S' ρ)) ϕ^{svar:0↦fresh3}^{svar:dbi↦Y} = eval (update_svar_val Y S (update_svar_val fresh3 S' ρ)) ϕ^{svar:0↦fresh3}^{svar:dbi↦Y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: Datatypes.S (size ϕ) ≤ Datatypes.S sz
X, Y: svar
S: propset M
HfrX: svar_is_fresh_in X (ex , (mu , ϕ))
HfrY: svar_is_fresh_in Y (ex , (mu , ϕ))
S': propset M
X': svar
HeqX': X' = fresh_svar ϕ^{svar:Datatypes.S dbi↦X}
Y': svar
HeqY': Y' = fresh_svar ϕ^{svar:Datatypes.S dbi↦Y}
fresh3: svar
Hneqfr1: fresh3 ≠ X
Hneqfr2: fresh3 ≠ Y
Hneqfr11: fresh3 ≠ X'
Hneqfr22: fresh3 ≠ Y'
HnotinFree1: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦X}
HnotinFree2: fresh3 ∉ free_svars ϕ^{svar:Datatypes.S dbi↦Y}
HnotinFree: fresh3 ∉ free_svars ϕ
Heqfresh3: fresh3 = svar_fresh (elements ({[X]} ∪ ({[Y]} ∪ ({[X']} ∪ ({[Y']} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦X} ∪ (free_svars ϕ^{svar: Datatypes.S dbi↦Y} ∪ free_svars ϕ)))))))

eval (update_svar_val Y S (update_svar_val fresh3 S' ρ)) ϕ^{svar:0↦fresh3}^{svar:dbi↦Y} = eval (update_svar_val Y S (update_svar_val fresh3 S' ρ)) ϕ^{svar:0↦fresh3}^{svar:dbi↦Y}
reflexivity.
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: size ϕ ≤ S sz

(x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: size ϕ ≤ S sz

(x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y}
(* inductive case - evar *)
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: size ϕ ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x ϕ
Hfry: evar_is_fresh_in y ϕ

eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
x0: evar
dbi: db_index
ρ: Valuation
Hsz: 0 ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (patt_free_evar x0)
Hfry: evar_is_fresh_in y (patt_free_evar x0)

eval (update_evar_val x c ρ) (patt_free_evar x0)^{evar:dbi↦x} = eval (update_evar_val y c ρ) (patt_free_evar x0)^{evar:dbi↦y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
x0: svar
dbi: db_index
ρ: Valuation
Hsz: 0 ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (patt_free_svar x0)
Hfry: evar_is_fresh_in y (patt_free_svar x0)
eval (update_evar_val x c ρ) (patt_free_svar x0)^{evar:dbi↦x} = eval (update_evar_val y c ρ) (patt_free_svar x0)^{evar:dbi↦y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
n, dbi: db_index
ρ: Valuation
Hsz: 0 ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (patt_bound_evar n)
Hfry: evar_is_fresh_in y (patt_bound_evar n)
eval (update_evar_val x c ρ) (patt_bound_evar n)^{evar:dbi↦x} = eval (update_evar_val y c ρ) (patt_bound_evar n)^{evar:dbi↦y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
n, dbi: db_index
ρ: Valuation
Hsz: 0 ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (patt_bound_svar n)
Hfry: evar_is_fresh_in y (patt_bound_svar n)
eval (update_evar_val x c ρ) (patt_bound_svar n)^{evar:dbi↦x} = eval (update_evar_val y c ρ) (patt_bound_svar n)^{evar:dbi↦y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
sigma: symbols
dbi: db_index
ρ: Valuation
Hsz: 0 ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (patt_sym sigma)
Hfry: evar_is_fresh_in y (patt_sym sigma)
eval (update_evar_val x c ρ) (patt_sym sigma)^{evar:dbi↦x} = eval (update_evar_val y c ρ) (patt_sym sigma)^{evar:dbi↦y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ1 + size ϕ2) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ϕ1 $ ϕ2)
Hfry: evar_is_fresh_in y (ϕ1 $ ϕ2)
eval (update_evar_val x c ρ) (ϕ1 $ ϕ2)^{evar:dbi↦x} = eval (update_evar_val y c ρ) (ϕ1 $ ϕ2)^{evar:dbi↦y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
dbi: db_index
ρ: Valuation
Hsz: 0 ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x ⊥
Hfry: evar_is_fresh_in y ⊥
eval (update_evar_val x c ρ) ⊥^{evar:dbi↦x} = eval (update_evar_val y c ρ) ⊥^{evar:dbi↦y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ1 + size ϕ2) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ϕ1 ---> ϕ2)
Hfry: evar_is_fresh_in y (ϕ1 ---> ϕ2)
eval (update_evar_val x c ρ) (ϕ1 ---> ϕ2)^{evar:dbi↦x} = eval (update_evar_val y c ρ) (ϕ1 ---> ϕ2)^{evar:dbi↦y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , ϕ)
Hfry: evar_is_fresh_in y (ex , ϕ)
eval (update_evar_val x c ρ) (ex , ϕ)^{evar:dbi↦x} = eval (update_evar_val y c ρ) (ex , ϕ)^{evar:dbi↦y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (mu , ϕ)
Hfry: evar_is_fresh_in y (mu , ϕ)
eval (update_evar_val x c ρ) (mu , ϕ)^{evar:dbi↦x} = eval (update_evar_val y c ρ) (mu , ϕ)^{evar:dbi↦y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
x0: evar
dbi: db_index
ρ: Valuation
Hsz: 0 ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (patt_free_evar x0)
Hfry: evar_is_fresh_in y (patt_free_evar x0)

eval (update_evar_val x c ρ) (patt_free_evar x0)^{evar:dbi↦x} = eval (update_evar_val y c ρ) (patt_free_evar x0)^{evar:dbi↦y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
x0: evar
dbi: db_index
ρ: Valuation
Hsz: 0 ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (patt_free_evar x0)
Hfry: evar_is_fresh_in y (patt_free_evar x0)

size (patt_free_evar x0) ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
x0: evar
dbi: db_index
ρ: Valuation
Hsz: 0 ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (patt_free_evar x0)
Hfry: evar_is_fresh_in y (patt_free_evar x0)
evar_is_fresh_in x (patt_free_evar x0)
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
x0: evar
dbi: db_index
ρ: Valuation
Hsz: 0 ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (patt_free_evar x0)
Hfry: evar_is_fresh_in y (patt_free_evar x0)
evar_is_fresh_in y (patt_free_evar x0)
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
x0: evar
dbi: db_index
ρ: Valuation
Hsz: 0 ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (patt_free_evar x0)
Hfry: evar_is_fresh_in y (patt_free_evar x0)
eval (update_evar_val y c ρ) (patt_free_evar x0)^{evar:dbi↦y} = eval (update_evar_val y c ρ) (patt_free_evar x0)^{evar:dbi↦y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
x0: evar
dbi: db_index
ρ: Valuation
Hsz: 0 ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (patt_free_evar x0)
Hfry: evar_is_fresh_in y (patt_free_evar x0)

size (patt_free_evar x0) ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
x0: evar
dbi: db_index
ρ: Valuation
Hsz: 0 ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (patt_free_evar x0)
Hfry: evar_is_fresh_in y (patt_free_evar x0)
evar_is_fresh_in x (patt_free_evar x0)
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
x0: evar
dbi: db_index
ρ: Valuation
Hsz: 0 ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (patt_free_evar x0)
Hfry: evar_is_fresh_in y (patt_free_evar x0)
evar_is_fresh_in y (patt_free_evar x0)
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
x0: evar
dbi: db_index
ρ: Valuation
Hsz: 0 ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (patt_free_evar x0)
Hfry: evar_is_fresh_in y (patt_free_evar x0)

size (patt_free_evar x0) ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
x0: evar
dbi: db_index
ρ: Valuation
Hsz: 0 ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (patt_free_evar x0)
Hfry: evar_is_fresh_in y (patt_free_evar x0)

0 ≤ sz
lia.
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
x0: svar
dbi: db_index
ρ: Valuation
Hsz: 0 ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (patt_free_svar x0)
Hfry: evar_is_fresh_in y (patt_free_svar x0)

eval (update_evar_val x c ρ) (patt_free_svar x0)^{evar:dbi↦x} = eval (update_evar_val y c ρ) (patt_free_svar x0)^{evar:dbi↦y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
x0: svar
dbi: db_index
ρ: Valuation
Hsz: 0 ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (patt_free_svar x0)
Hfry: evar_is_fresh_in y (patt_free_svar x0)

size (patt_free_svar x0) ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
x0: svar
dbi: db_index
ρ: Valuation
Hsz: 0 ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (patt_free_svar x0)
Hfry: evar_is_fresh_in y (patt_free_svar x0)
evar_is_fresh_in x (patt_free_svar x0)
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
x0: svar
dbi: db_index
ρ: Valuation
Hsz: 0 ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (patt_free_svar x0)
Hfry: evar_is_fresh_in y (patt_free_svar x0)
evar_is_fresh_in y (patt_free_svar x0)
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
x0: svar
dbi: db_index
ρ: Valuation
Hsz: 0 ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (patt_free_svar x0)
Hfry: evar_is_fresh_in y (patt_free_svar x0)
eval (update_evar_val y c ρ) (patt_free_svar x0)^{evar:dbi↦y} = eval (update_evar_val y c ρ) (patt_free_svar x0)^{evar:dbi↦y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
x0: svar
dbi: db_index
ρ: Valuation
Hsz: 0 ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (patt_free_svar x0)
Hfry: evar_is_fresh_in y (patt_free_svar x0)

size (patt_free_svar x0) ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
x0: svar
dbi: db_index
ρ: Valuation
Hsz: 0 ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (patt_free_svar x0)
Hfry: evar_is_fresh_in y (patt_free_svar x0)
evar_is_fresh_in x (patt_free_svar x0)
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
x0: svar
dbi: db_index
ρ: Valuation
Hsz: 0 ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (patt_free_svar x0)
Hfry: evar_is_fresh_in y (patt_free_svar x0)
evar_is_fresh_in y (patt_free_svar x0)
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
x0: svar
dbi: db_index
ρ: Valuation
Hsz: 0 ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (patt_free_svar x0)
Hfry: evar_is_fresh_in y (patt_free_svar x0)

size (patt_free_svar x0) ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
x0: svar
dbi: db_index
ρ: Valuation
Hsz: 0 ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (patt_free_svar x0)
Hfry: evar_is_fresh_in y (patt_free_svar x0)

0 ≤ sz
lia.
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
n, dbi: db_index
ρ: Valuation
Hsz: 0 ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (patt_bound_evar n)
Hfry: evar_is_fresh_in y (patt_bound_evar n)

eval (update_evar_val x c ρ) (patt_bound_evar n)^{evar:dbi↦x} = eval (update_evar_val y c ρ) (patt_bound_evar n)^{evar:dbi↦y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
n, dbi: db_index
ρ: Valuation
Hsz: 0 ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (patt_bound_evar n)
Hfry: evar_is_fresh_in y (patt_bound_evar n)

size (patt_bound_evar n) ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
n, dbi: db_index
ρ: Valuation
Hsz: 0 ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (patt_bound_evar n)
Hfry: evar_is_fresh_in y (patt_bound_evar n)
evar_is_fresh_in x (patt_bound_evar n)
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
n, dbi: db_index
ρ: Valuation
Hsz: 0 ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (patt_bound_evar n)
Hfry: evar_is_fresh_in y (patt_bound_evar n)
evar_is_fresh_in y (patt_bound_evar n)
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
n, dbi: db_index
ρ: Valuation
Hsz: 0 ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (patt_bound_evar n)
Hfry: evar_is_fresh_in y (patt_bound_evar n)
eval (update_evar_val y c ρ) (patt_bound_evar n)^{evar:dbi↦y} = eval (update_evar_val y c ρ) (patt_bound_evar n)^{evar:dbi↦y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
n, dbi: db_index
ρ: Valuation
Hsz: 0 ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (patt_bound_evar n)
Hfry: evar_is_fresh_in y (patt_bound_evar n)

size (patt_bound_evar n) ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
n, dbi: db_index
ρ: Valuation
Hsz: 0 ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (patt_bound_evar n)
Hfry: evar_is_fresh_in y (patt_bound_evar n)
evar_is_fresh_in x (patt_bound_evar n)
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
n, dbi: db_index
ρ: Valuation
Hsz: 0 ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (patt_bound_evar n)
Hfry: evar_is_fresh_in y (patt_bound_evar n)
evar_is_fresh_in y (patt_bound_evar n)
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
n, dbi: db_index
ρ: Valuation
Hsz: 0 ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (patt_bound_evar n)
Hfry: evar_is_fresh_in y (patt_bound_evar n)

size (patt_bound_evar n) ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
n, dbi: db_index
ρ: Valuation
Hsz: 0 ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (patt_bound_evar n)
Hfry: evar_is_fresh_in y (patt_bound_evar n)

0 ≤ sz
lia.
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
n, dbi: db_index
ρ: Valuation
Hsz: 0 ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (patt_bound_svar n)
Hfry: evar_is_fresh_in y (patt_bound_svar n)

eval (update_evar_val x c ρ) (patt_bound_svar n)^{evar:dbi↦x} = eval (update_evar_val y c ρ) (patt_bound_svar n)^{evar:dbi↦y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
n, dbi: db_index
ρ: Valuation
Hsz: 0 ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (patt_bound_svar n)
Hfry: evar_is_fresh_in y (patt_bound_svar n)

size (patt_bound_svar n) ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
n, dbi: db_index
ρ: Valuation
Hsz: 0 ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (patt_bound_svar n)
Hfry: evar_is_fresh_in y (patt_bound_svar n)
evar_is_fresh_in x (patt_bound_svar n)
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
n, dbi: db_index
ρ: Valuation
Hsz: 0 ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (patt_bound_svar n)
Hfry: evar_is_fresh_in y (patt_bound_svar n)
evar_is_fresh_in y (patt_bound_svar n)
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
n, dbi: db_index
ρ: Valuation
Hsz: 0 ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (patt_bound_svar n)
Hfry: evar_is_fresh_in y (patt_bound_svar n)
eval (update_evar_val y c ρ) (patt_bound_svar n)^{evar:dbi↦y} = eval (update_evar_val y c ρ) (patt_bound_svar n)^{evar:dbi↦y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
n, dbi: db_index
ρ: Valuation
Hsz: 0 ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (patt_bound_svar n)
Hfry: evar_is_fresh_in y (patt_bound_svar n)

size (patt_bound_svar n) ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
n, dbi: db_index
ρ: Valuation
Hsz: 0 ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (patt_bound_svar n)
Hfry: evar_is_fresh_in y (patt_bound_svar n)
evar_is_fresh_in x (patt_bound_svar n)
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
n, dbi: db_index
ρ: Valuation
Hsz: 0 ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (patt_bound_svar n)
Hfry: evar_is_fresh_in y (patt_bound_svar n)
evar_is_fresh_in y (patt_bound_svar n)
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
n, dbi: db_index
ρ: Valuation
Hsz: 0 ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (patt_bound_svar n)
Hfry: evar_is_fresh_in y (patt_bound_svar n)

size (patt_bound_svar n) ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
n, dbi: db_index
ρ: Valuation
Hsz: 0 ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (patt_bound_svar n)
Hfry: evar_is_fresh_in y (patt_bound_svar n)

0 ≤ sz
lia.
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
sigma: symbols
dbi: db_index
ρ: Valuation
Hsz: 0 ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (patt_sym sigma)
Hfry: evar_is_fresh_in y (patt_sym sigma)

eval (update_evar_val x c ρ) (patt_sym sigma)^{evar:dbi↦x} = eval (update_evar_val y c ρ) (patt_sym sigma)^{evar:dbi↦y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
sigma: symbols
dbi: db_index
ρ: Valuation
Hsz: 0 ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (patt_sym sigma)
Hfry: evar_is_fresh_in y (patt_sym sigma)

size (patt_sym sigma) ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
sigma: symbols
dbi: db_index
ρ: Valuation
Hsz: 0 ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (patt_sym sigma)
Hfry: evar_is_fresh_in y (patt_sym sigma)
evar_is_fresh_in x (patt_sym sigma)
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
sigma: symbols
dbi: db_index
ρ: Valuation
Hsz: 0 ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (patt_sym sigma)
Hfry: evar_is_fresh_in y (patt_sym sigma)
evar_is_fresh_in y (patt_sym sigma)
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
sigma: symbols
dbi: db_index
ρ: Valuation
Hsz: 0 ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (patt_sym sigma)
Hfry: evar_is_fresh_in y (patt_sym sigma)
eval (update_evar_val y c ρ) (patt_sym sigma)^{evar:dbi↦y} = eval (update_evar_val y c ρ) (patt_sym sigma)^{evar:dbi↦y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
sigma: symbols
dbi: db_index
ρ: Valuation
Hsz: 0 ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (patt_sym sigma)
Hfry: evar_is_fresh_in y (patt_sym sigma)

size (patt_sym sigma) ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
sigma: symbols
dbi: db_index
ρ: Valuation
Hsz: 0 ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (patt_sym sigma)
Hfry: evar_is_fresh_in y (patt_sym sigma)
evar_is_fresh_in x (patt_sym sigma)
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
sigma: symbols
dbi: db_index
ρ: Valuation
Hsz: 0 ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (patt_sym sigma)
Hfry: evar_is_fresh_in y (patt_sym sigma)
evar_is_fresh_in y (patt_sym sigma)
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
sigma: symbols
dbi: db_index
ρ: Valuation
Hsz: 0 ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (patt_sym sigma)
Hfry: evar_is_fresh_in y (patt_sym sigma)

size (patt_sym sigma) ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
sigma: symbols
dbi: db_index
ρ: Valuation
Hsz: 0 ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (patt_sym sigma)
Hfry: evar_is_fresh_in y (patt_sym sigma)

0 ≤ sz
lia.
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ1 + size ϕ2) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ϕ1 $ ϕ2)
Hfry: evar_is_fresh_in y (ϕ1 $ ϕ2)

eval (update_evar_val x c ρ) (ϕ1 $ ϕ2)^{evar:dbi↦x} = eval (update_evar_val y c ρ) (ϕ1 $ ϕ2)^{evar:dbi↦y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ1 + size ϕ2) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ϕ1 $ ϕ2)
Hfry: evar_is_fresh_in y (ϕ1 $ ϕ2)

app_ext (eval (update_evar_val x c ρ) ((fix bevar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_evar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_evar (Nat.pred n) end | patt_bound_svar n => patt_bound_svar n | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bevar_subst psi x phi1 $ bevar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bevar_subst psi x phi1 ---> bevar_subst psi x phi2 | ex , phi' => ex , bevar_subst psi (S x) phi' | mu , phi' => mu , bevar_subst psi x phi' end) (patt_free_evar x) dbi ϕ1)) (eval (update_evar_val x c ρ) ((fix bevar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_evar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_evar (Nat.pred n) end | patt_bound_svar n => patt_bound_svar n | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bevar_subst psi x phi1 $ bevar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bevar_subst psi x phi1 ---> bevar_subst psi x phi2 | ex , phi' => ex , bevar_subst psi (S x) phi' | mu , phi' => mu , bevar_subst psi x phi' end) (patt_free_evar x) dbi ϕ2)) = app_ext (eval (update_evar_val y c ρ) ((fix bevar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_evar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_evar (Nat.pred n) end | patt_bound_svar n => patt_bound_svar n | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bevar_subst psi x phi1 $ bevar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bevar_subst psi x phi1 ---> bevar_subst psi x phi2 | ex , phi' => ex , bevar_subst psi (S x) phi' | mu , phi' => mu , bevar_subst psi x phi' end) (patt_free_evar y) dbi ϕ1)) (eval (update_evar_val y c ρ) ((fix bevar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_evar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_evar (Nat.pred n) end | patt_bound_svar n => patt_bound_svar n | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bevar_subst psi x phi1 $ bevar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bevar_subst psi x phi1 ---> bevar_subst psi x phi2 | ex , phi' => ex , bevar_subst psi (S x) phi' | mu , phi' => mu , bevar_subst psi x phi' end) (patt_free_evar y) dbi ϕ2))
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ1 + size ϕ2) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ϕ1 $ ϕ2)
Hfry: evar_is_fresh_in y (ϕ1 $ ϕ2)

app_ext (eval (update_evar_val x c ρ) ((fix bevar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_evar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_evar (Nat.pred n) end | patt_bound_svar n => patt_bound_svar n | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bevar_subst psi x phi1 $ bevar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bevar_subst psi x phi1 ---> bevar_subst psi x phi2 | ex , phi' => ex , bevar_subst psi (S x) phi' | mu , phi' => mu , bevar_subst psi x phi' end) (patt_free_evar x) dbi ϕ1)) (eval (update_evar_val x c ρ) ((fix bevar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_evar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_evar (Nat.pred n) end | patt_bound_svar n => patt_bound_svar n | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bevar_subst psi x phi1 $ bevar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bevar_subst psi x phi1 ---> bevar_subst psi x phi2 | ex , phi' => ex , bevar_subst psi (S x) phi' | mu , phi' => mu , bevar_subst psi x phi' end) (patt_free_evar x) dbi ϕ2)) = app_ext (eval (update_evar_val y c ρ) ((fix bevar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_evar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_evar (Nat.pred n) end | patt_bound_svar n => patt_bound_svar n | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bevar_subst psi x phi1 $ bevar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bevar_subst psi x phi1 ---> bevar_subst psi x phi2 | ex , phi' => ex , bevar_subst psi (S x) phi' | mu , phi' => mu , bevar_subst psi x phi' end) (patt_free_evar y) dbi ϕ1)) (eval (update_evar_val y c ρ) ((fix bevar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_evar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_evar (Nat.pred n) end | patt_bound_svar n => patt_bound_svar n | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bevar_subst psi x phi1 $ bevar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bevar_subst psi x phi1 ---> bevar_subst psi x phi2 | ex , phi' => ex , bevar_subst psi (S x) phi' | mu , phi' => mu , bevar_subst psi x phi' end) (patt_free_evar y) dbi ϕ2))
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ1 + size ϕ2) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ϕ1 $ ϕ2)
Hfry: evar_is_fresh_in y (ϕ1 $ ϕ2)

size ϕ1 ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ1 + size ϕ2) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ϕ1 $ ϕ2)
Hfry: evar_is_fresh_in y (ϕ1 $ ϕ2)
evar_is_fresh_in x ϕ1
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ1 + size ϕ2) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ϕ1 $ ϕ2)
Hfry: evar_is_fresh_in y (ϕ1 $ ϕ2)
evar_is_fresh_in y ϕ1
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ1 + size ϕ2) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ϕ1 $ ϕ2)
Hfry: evar_is_fresh_in y (ϕ1 $ ϕ2)
app_ext (eval (update_evar_val y c ρ) ϕ1^{evar:dbi↦y}) (eval (update_evar_val x c ρ) ((fix bevar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_evar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_evar (Nat.pred n) end | patt_bound_svar n => patt_bound_svar n | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bevar_subst psi x phi1 $ bevar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bevar_subst psi x phi1 ---> bevar_subst psi x phi2 | ex , phi' => ex , bevar_subst psi (S x) phi' | mu , phi' => mu , bevar_subst psi x phi' end) (patt_free_evar x) dbi ϕ2)) = app_ext (eval (update_evar_val y c ρ) ((fix bevar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_evar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_evar (Nat.pred n) end | patt_bound_svar n => patt_bound_svar n | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bevar_subst psi x phi1 $ bevar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bevar_subst psi x phi1 ---> bevar_subst psi x phi2 | ex , phi' => ex , bevar_subst psi (S x) phi' | mu , phi' => mu , bevar_subst psi x phi' end) (patt_free_evar y) dbi ϕ1)) (eval (update_evar_val y c ρ) ((fix bevar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_evar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_evar (Nat.pred n) end | patt_bound_svar n => patt_bound_svar n | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bevar_subst psi x phi1 $ bevar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bevar_subst psi x phi1 ---> bevar_subst psi x phi2 | ex , phi' => ex , bevar_subst psi (S x) phi' | mu , phi' => mu , bevar_subst psi x phi' end) (patt_free_evar y) dbi ϕ2))
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ1 + size ϕ2) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ϕ1 $ ϕ2)
Hfry: evar_is_fresh_in y (ϕ1 $ ϕ2)

size ϕ1 ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ1 + size ϕ2) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ϕ1 $ ϕ2)
Hfry: evar_is_fresh_in y (ϕ1 $ ϕ2)
evar_is_fresh_in x ϕ1
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ1 + size ϕ2) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ϕ1 $ ϕ2)
Hfry: evar_is_fresh_in y (ϕ1 $ ϕ2)
evar_is_fresh_in y ϕ1
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ1 + size ϕ2) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ϕ1 $ ϕ2)
Hfry: evar_is_fresh_in y (ϕ1 $ ϕ2)
size ϕ2 ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ1 + size ϕ2) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ϕ1 $ ϕ2)
Hfry: evar_is_fresh_in y (ϕ1 $ ϕ2)
evar_is_fresh_in x ϕ2
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ1 + size ϕ2) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ϕ1 $ ϕ2)
Hfry: evar_is_fresh_in y (ϕ1 $ ϕ2)
evar_is_fresh_in y ϕ2
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ1 + size ϕ2) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ϕ1 $ ϕ2)
Hfry: evar_is_fresh_in y (ϕ1 $ ϕ2)
app_ext (eval (update_evar_val y c ρ) ϕ1^{evar:dbi↦y}) (eval (update_evar_val y c ρ) ϕ2^{evar:dbi↦y}) = app_ext (eval (update_evar_val y c ρ) ((fix bevar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_evar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_evar (Nat.pred n) end | patt_bound_svar n => patt_bound_svar n | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bevar_subst psi x phi1 $ bevar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bevar_subst psi x phi1 ---> bevar_subst psi x phi2 | ex , phi' => ex , bevar_subst psi (S x) phi' | mu , phi' => mu , bevar_subst psi x phi' end) (patt_free_evar y) dbi ϕ1)) (eval (update_evar_val y c ρ) ((fix bevar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_evar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_evar (Nat.pred n) end | patt_bound_svar n => patt_bound_svar n | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bevar_subst psi x phi1 $ bevar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bevar_subst psi x phi1 ---> bevar_subst psi x phi2 | ex , phi' => ex , bevar_subst psi (S x) phi' | mu , phi' => mu , bevar_subst psi x phi' end) (patt_free_evar y) dbi ϕ2))
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ1 + size ϕ2) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ϕ1 $ ϕ2)
Hfry: evar_is_fresh_in y (ϕ1 $ ϕ2)

evar_is_fresh_in x ϕ1
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ1 + size ϕ2) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ϕ1 $ ϕ2)
Hfry: evar_is_fresh_in y (ϕ1 $ ϕ2)
evar_is_fresh_in y ϕ1
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ1 + size ϕ2) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ϕ1 $ ϕ2)
Hfry: evar_is_fresh_in y (ϕ1 $ ϕ2)
size ϕ2 ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ1 + size ϕ2) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ϕ1 $ ϕ2)
Hfry: evar_is_fresh_in y (ϕ1 $ ϕ2)
evar_is_fresh_in x ϕ2
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ1 + size ϕ2) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ϕ1 $ ϕ2)
Hfry: evar_is_fresh_in y (ϕ1 $ ϕ2)
evar_is_fresh_in y ϕ2
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ1 + size ϕ2) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ϕ1 $ ϕ2)
Hfry: evar_is_fresh_in y (ϕ1 $ ϕ2)
app_ext (eval (update_evar_val y c ρ) ϕ1^{evar:dbi↦y}) (eval (update_evar_val y c ρ) ϕ2^{evar:dbi↦y}) = app_ext (eval (update_evar_val y c ρ) ((fix bevar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_evar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_evar (Nat.pred n) end | patt_bound_svar n => patt_bound_svar n | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bevar_subst psi x phi1 $ bevar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bevar_subst psi x phi1 ---> bevar_subst psi x phi2 | ex , phi' => ex , bevar_subst psi (S x) phi' | mu , phi' => mu , bevar_subst psi x phi' end) (patt_free_evar y) dbi ϕ1)) (eval (update_evar_val y c ρ) ((fix bevar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_evar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_evar (Nat.pred n) end | patt_bound_svar n => patt_bound_svar n | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bevar_subst psi x phi1 $ bevar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bevar_subst psi x phi1 ---> bevar_subst psi x phi2 | ex , phi' => ex , bevar_subst psi (S x) phi' | mu , phi' => mu , bevar_subst psi x phi' end) (patt_free_evar y) dbi ϕ2))
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ1 + size ϕ2) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ϕ1 $ ϕ2)
Hfry: evar_is_fresh_in y (ϕ1 $ ϕ2)

evar_is_fresh_in x (ϕ1 $ ?ϕ₂)
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ1 + size ϕ2) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ϕ1 $ ϕ2)
Hfry: evar_is_fresh_in y (ϕ1 $ ϕ2)
evar_is_fresh_in y ϕ1
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ1 + size ϕ2) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ϕ1 $ ϕ2)
Hfry: evar_is_fresh_in y (ϕ1 $ ϕ2)
size ϕ2 ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ1 + size ϕ2) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ϕ1 $ ϕ2)
Hfry: evar_is_fresh_in y (ϕ1 $ ϕ2)
evar_is_fresh_in x ϕ2
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ1 + size ϕ2) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ϕ1 $ ϕ2)
Hfry: evar_is_fresh_in y (ϕ1 $ ϕ2)
evar_is_fresh_in y ϕ2
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ1 + size ϕ2) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ϕ1 $ ϕ2)
Hfry: evar_is_fresh_in y (ϕ1 $ ϕ2)
app_ext (eval (update_evar_val y c ρ) ϕ1^{evar:dbi↦y}) (eval (update_evar_val y c ρ) ϕ2^{evar:dbi↦y}) = app_ext (eval (update_evar_val y c ρ) ((fix bevar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_evar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_evar (Nat.pred n) end | patt_bound_svar n => patt_bound_svar n | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bevar_subst psi x phi1 $ bevar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bevar_subst psi x phi1 ---> bevar_subst psi x phi2 | ex , phi' => ex , bevar_subst psi (S x) phi' | mu , phi' => mu , bevar_subst psi x phi' end) (patt_free_evar y) dbi ϕ1)) (eval (update_evar_val y c ρ) ((fix bevar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_evar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_evar (Nat.pred n) end | patt_bound_svar n => patt_bound_svar n | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bevar_subst psi x phi1 $ bevar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bevar_subst psi x phi1 ---> bevar_subst psi x phi2 | ex , phi' => ex , bevar_subst psi (S x) phi' | mu , phi' => mu , bevar_subst psi x phi' end) (patt_free_evar y) dbi ϕ2))
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ1 + size ϕ2) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ϕ1 $ ϕ2)
Hfry: evar_is_fresh_in y (ϕ1 $ ϕ2)

evar_is_fresh_in y ϕ1
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ1 + size ϕ2) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ϕ1 $ ϕ2)
Hfry: evar_is_fresh_in y (ϕ1 $ ϕ2)
size ϕ2 ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ1 + size ϕ2) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ϕ1 $ ϕ2)
Hfry: evar_is_fresh_in y (ϕ1 $ ϕ2)
evar_is_fresh_in x ϕ2
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ1 + size ϕ2) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ϕ1 $ ϕ2)
Hfry: evar_is_fresh_in y (ϕ1 $ ϕ2)
evar_is_fresh_in y ϕ2
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ1 + size ϕ2) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ϕ1 $ ϕ2)
Hfry: evar_is_fresh_in y (ϕ1 $ ϕ2)
app_ext (eval (update_evar_val y c ρ) ϕ1^{evar:dbi↦y}) (eval (update_evar_val y c ρ) ϕ2^{evar:dbi↦y}) = app_ext (eval (update_evar_val y c ρ) ((fix bevar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_evar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_evar (Nat.pred n) end | patt_bound_svar n => patt_bound_svar n | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bevar_subst psi x phi1 $ bevar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bevar_subst psi x phi1 ---> bevar_subst psi x phi2 | ex , phi' => ex , bevar_subst psi (S x) phi' | mu , phi' => mu , bevar_subst psi x phi' end) (patt_free_evar y) dbi ϕ1)) (eval (update_evar_val y c ρ) ((fix bevar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_evar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_evar (Nat.pred n) end | patt_bound_svar n => patt_bound_svar n | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bevar_subst psi x phi1 $ bevar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bevar_subst psi x phi1 ---> bevar_subst psi x phi2 | ex , phi' => ex , bevar_subst psi (S x) phi' | mu , phi' => mu , bevar_subst psi x phi' end) (patt_free_evar y) dbi ϕ2))
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ1 + size ϕ2) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ϕ1 $ ϕ2)
Hfry: evar_is_fresh_in y (ϕ1 $ ϕ2)

evar_is_fresh_in y (ϕ1 $ ?ϕ₂)
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ1 + size ϕ2) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ϕ1 $ ϕ2)
Hfry: evar_is_fresh_in y (ϕ1 $ ϕ2)
size ϕ2 ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ1 + size ϕ2) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ϕ1 $ ϕ2)
Hfry: evar_is_fresh_in y (ϕ1 $ ϕ2)
evar_is_fresh_in x ϕ2
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ1 + size ϕ2) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ϕ1 $ ϕ2)
Hfry: evar_is_fresh_in y (ϕ1 $ ϕ2)
evar_is_fresh_in y ϕ2
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ1 + size ϕ2) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ϕ1 $ ϕ2)
Hfry: evar_is_fresh_in y (ϕ1 $ ϕ2)
app_ext (eval (update_evar_val y c ρ) ϕ1^{evar:dbi↦y}) (eval (update_evar_val y c ρ) ϕ2^{evar:dbi↦y}) = app_ext (eval (update_evar_val y c ρ) ((fix bevar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_evar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_evar (Nat.pred n) end | patt_bound_svar n => patt_bound_svar n | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bevar_subst psi x phi1 $ bevar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bevar_subst psi x phi1 ---> bevar_subst psi x phi2 | ex , phi' => ex , bevar_subst psi (S x) phi' | mu , phi' => mu , bevar_subst psi x phi' end) (patt_free_evar y) dbi ϕ1)) (eval (update_evar_val y c ρ) ((fix bevar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_evar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_evar (Nat.pred n) end | patt_bound_svar n => patt_bound_svar n | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bevar_subst psi x phi1 $ bevar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bevar_subst psi x phi1 ---> bevar_subst psi x phi2 | ex , phi' => ex , bevar_subst psi (S x) phi' | mu , phi' => mu , bevar_subst psi x phi' end) (patt_free_evar y) dbi ϕ2))
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ1 + size ϕ2) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ϕ1 $ ϕ2)
Hfry: evar_is_fresh_in y (ϕ1 $ ϕ2)

size ϕ2 ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ1 + size ϕ2) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ϕ1 $ ϕ2)
Hfry: evar_is_fresh_in y (ϕ1 $ ϕ2)
evar_is_fresh_in x ϕ2
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ1 + size ϕ2) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ϕ1 $ ϕ2)
Hfry: evar_is_fresh_in y (ϕ1 $ ϕ2)
evar_is_fresh_in y ϕ2
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ1 + size ϕ2) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ϕ1 $ ϕ2)
Hfry: evar_is_fresh_in y (ϕ1 $ ϕ2)
app_ext (eval (update_evar_val y c ρ) ϕ1^{evar:dbi↦y}) (eval (update_evar_val y c ρ) ϕ2^{evar:dbi↦y}) = app_ext (eval (update_evar_val y c ρ) ((fix bevar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_evar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_evar (Nat.pred n) end | patt_bound_svar n => patt_bound_svar n | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bevar_subst psi x phi1 $ bevar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bevar_subst psi x phi1 ---> bevar_subst psi x phi2 | ex , phi' => ex , bevar_subst psi (S x) phi' | mu , phi' => mu , bevar_subst psi x phi' end) (patt_free_evar y) dbi ϕ1)) (eval (update_evar_val y c ρ) ((fix bevar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_evar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_evar (Nat.pred n) end | patt_bound_svar n => patt_bound_svar n | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bevar_subst psi x phi1 $ bevar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bevar_subst psi x phi1 ---> bevar_subst psi x phi2 | ex , phi' => ex , bevar_subst psi (S x) phi' | mu , phi' => mu , bevar_subst psi x phi' end) (patt_free_evar y) dbi ϕ2))
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ1 + size ϕ2) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ϕ1 $ ϕ2)
Hfry: evar_is_fresh_in y (ϕ1 $ ϕ2)

evar_is_fresh_in x ϕ2
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ1 + size ϕ2) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ϕ1 $ ϕ2)
Hfry: evar_is_fresh_in y (ϕ1 $ ϕ2)
evar_is_fresh_in y ϕ2
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ1 + size ϕ2) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ϕ1 $ ϕ2)
Hfry: evar_is_fresh_in y (ϕ1 $ ϕ2)
app_ext (eval (update_evar_val y c ρ) ϕ1^{evar:dbi↦y}) (eval (update_evar_val y c ρ) ϕ2^{evar:dbi↦y}) = app_ext (eval (update_evar_val y c ρ) ((fix bevar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_evar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_evar (Nat.pred n) end | patt_bound_svar n => patt_bound_svar n | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bevar_subst psi x phi1 $ bevar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bevar_subst psi x phi1 ---> bevar_subst psi x phi2 | ex , phi' => ex , bevar_subst psi (S x) phi' | mu , phi' => mu , bevar_subst psi x phi' end) (patt_free_evar y) dbi ϕ1)) (eval (update_evar_val y c ρ) ((fix bevar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_evar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_evar (Nat.pred n) end | patt_bound_svar n => patt_bound_svar n | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bevar_subst psi x phi1 $ bevar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bevar_subst psi x phi1 ---> bevar_subst psi x phi2 | ex , phi' => ex , bevar_subst psi (S x) phi' | mu , phi' => mu , bevar_subst psi x phi' end) (patt_free_evar y) dbi ϕ2))
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ1 + size ϕ2) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ϕ1 $ ϕ2)
Hfry: evar_is_fresh_in y (ϕ1 $ ϕ2)

evar_is_fresh_in x (?ϕ₁ $ ϕ2)
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ1 + size ϕ2) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ϕ1 $ ϕ2)
Hfry: evar_is_fresh_in y (ϕ1 $ ϕ2)
evar_is_fresh_in y ϕ2
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ1 + size ϕ2) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ϕ1 $ ϕ2)
Hfry: evar_is_fresh_in y (ϕ1 $ ϕ2)
app_ext (eval (update_evar_val y c ρ) ϕ1^{evar:dbi↦y}) (eval (update_evar_val y c ρ) ϕ2^{evar:dbi↦y}) = app_ext (eval (update_evar_val y c ρ) ((fix bevar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_evar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_evar (Nat.pred n) end | patt_bound_svar n => patt_bound_svar n | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bevar_subst psi x phi1 $ bevar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bevar_subst psi x phi1 ---> bevar_subst psi x phi2 | ex , phi' => ex , bevar_subst psi (S x) phi' | mu , phi' => mu , bevar_subst psi x phi' end) (patt_free_evar y) dbi ϕ1)) (eval (update_evar_val y c ρ) ((fix bevar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_evar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_evar (Nat.pred n) end | patt_bound_svar n => patt_bound_svar n | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bevar_subst psi x phi1 $ bevar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bevar_subst psi x phi1 ---> bevar_subst psi x phi2 | ex , phi' => ex , bevar_subst psi (S x) phi' | mu , phi' => mu , bevar_subst psi x phi' end) (patt_free_evar y) dbi ϕ2))
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ1 + size ϕ2) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ϕ1 $ ϕ2)
Hfry: evar_is_fresh_in y (ϕ1 $ ϕ2)

evar_is_fresh_in y ϕ2
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ1 + size ϕ2) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ϕ1 $ ϕ2)
Hfry: evar_is_fresh_in y (ϕ1 $ ϕ2)
app_ext (eval (update_evar_val y c ρ) ϕ1^{evar:dbi↦y}) (eval (update_evar_val y c ρ) ϕ2^{evar:dbi↦y}) = app_ext (eval (update_evar_val y c ρ) ((fix bevar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_evar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_evar (Nat.pred n) end | patt_bound_svar n => patt_bound_svar n | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bevar_subst psi x phi1 $ bevar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bevar_subst psi x phi1 ---> bevar_subst psi x phi2 | ex , phi' => ex , bevar_subst psi (S x) phi' | mu , phi' => mu , bevar_subst psi x phi' end) (patt_free_evar y) dbi ϕ1)) (eval (update_evar_val y c ρ) ((fix bevar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_evar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_evar (Nat.pred n) end | patt_bound_svar n => patt_bound_svar n | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bevar_subst psi x phi1 $ bevar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bevar_subst psi x phi1 ---> bevar_subst psi x phi2 | ex , phi' => ex , bevar_subst psi (S x) phi' | mu , phi' => mu , bevar_subst psi x phi' end) (patt_free_evar y) dbi ϕ2))
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ1 + size ϕ2) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ϕ1 $ ϕ2)
Hfry: evar_is_fresh_in y (ϕ1 $ ϕ2)

evar_is_fresh_in y (?ϕ₁ $ ϕ2)
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ1 + size ϕ2) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ϕ1 $ ϕ2)
Hfry: evar_is_fresh_in y (ϕ1 $ ϕ2)
app_ext (eval (update_evar_val y c ρ) ϕ1^{evar:dbi↦y}) (eval (update_evar_val y c ρ) ϕ2^{evar:dbi↦y}) = app_ext (eval (update_evar_val y c ρ) ((fix bevar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_evar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_evar (Nat.pred n) end | patt_bound_svar n => patt_bound_svar n | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bevar_subst psi x phi1 $ bevar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bevar_subst psi x phi1 ---> bevar_subst psi x phi2 | ex , phi' => ex , bevar_subst psi (S x) phi' | mu , phi' => mu , bevar_subst psi x phi' end) (patt_free_evar y) dbi ϕ1)) (eval (update_evar_val y c ρ) ((fix bevar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_evar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_evar (Nat.pred n) end | patt_bound_svar n => patt_bound_svar n | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bevar_subst psi x phi1 $ bevar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bevar_subst psi x phi1 ---> bevar_subst psi x phi2 | ex , phi' => ex , bevar_subst psi (S x) phi' | mu , phi' => mu , bevar_subst psi x phi' end) (patt_free_evar y) dbi ϕ2))
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ1 + size ϕ2) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ϕ1 $ ϕ2)
Hfry: evar_is_fresh_in y (ϕ1 $ ϕ2)

app_ext (eval (update_evar_val y c ρ) ϕ1^{evar:dbi↦y}) (eval (update_evar_val y c ρ) ϕ2^{evar:dbi↦y}) = app_ext (eval (update_evar_val y c ρ) ((fix bevar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_evar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_evar (Nat.pred n) end | patt_bound_svar n => patt_bound_svar n | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bevar_subst psi x phi1 $ bevar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bevar_subst psi x phi1 ---> bevar_subst psi x phi2 | ex , phi' => ex , bevar_subst psi (S x) phi' | mu , phi' => mu , bevar_subst psi x phi' end) (patt_free_evar y) dbi ϕ1)) (eval (update_evar_val y c ρ) ((fix bevar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_evar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_evar (Nat.pred n) end | patt_bound_svar n => patt_bound_svar n | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bevar_subst psi x phi1 $ bevar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bevar_subst psi x phi1 ---> bevar_subst psi x phi2 | ex , phi' => ex , bevar_subst psi (S x) phi' | mu , phi' => mu , bevar_subst psi x phi' end) (patt_free_evar y) dbi ϕ2))
reflexivity.
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
dbi: db_index
ρ: Valuation
Hsz: 0 ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x ⊥
Hfry: evar_is_fresh_in y ⊥

eval (update_evar_val x c ρ) ⊥^{evar:dbi↦x} = eval (update_evar_val y c ρ) ⊥^{evar:dbi↦y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
dbi: db_index
ρ: Valuation
Hsz: 0 ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x ⊥
Hfry: evar_is_fresh_in y ⊥

size ⊥ ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
dbi: db_index
ρ: Valuation
Hsz: 0 ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x ⊥
Hfry: evar_is_fresh_in y ⊥
evar_is_fresh_in x ⊥
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
dbi: db_index
ρ: Valuation
Hsz: 0 ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x ⊥
Hfry: evar_is_fresh_in y ⊥
evar_is_fresh_in y ⊥
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
dbi: db_index
ρ: Valuation
Hsz: 0 ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x ⊥
Hfry: evar_is_fresh_in y ⊥
eval (update_evar_val y c ρ) ⊥^{evar:dbi↦y} = eval (update_evar_val y c ρ) ⊥^{evar:dbi↦y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
dbi: db_index
ρ: Valuation
Hsz: 0 ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x ⊥
Hfry: evar_is_fresh_in y ⊥

size ⊥ ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
dbi: db_index
ρ: Valuation
Hsz: 0 ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x ⊥
Hfry: evar_is_fresh_in y ⊥
evar_is_fresh_in x ⊥
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
dbi: db_index
ρ: Valuation
Hsz: 0 ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x ⊥
Hfry: evar_is_fresh_in y ⊥
evar_is_fresh_in y ⊥
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
dbi: db_index
ρ: Valuation
Hsz: 0 ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x ⊥
Hfry: evar_is_fresh_in y ⊥

size ⊥ ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
dbi: db_index
ρ: Valuation
Hsz: 0 ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x ⊥
Hfry: evar_is_fresh_in y ⊥

0 ≤ sz
lia.
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ1 + size ϕ2) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ϕ1 ---> ϕ2)
Hfry: evar_is_fresh_in y (ϕ1 ---> ϕ2)

eval (update_evar_val x c ρ) (ϕ1 ---> ϕ2)^{evar:dbi↦x} = eval (update_evar_val y c ρ) (ϕ1 ---> ϕ2)^{evar:dbi↦y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ1 + size ϕ2) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ϕ1 ---> ϕ2)
Hfry: evar_is_fresh_in y (ϕ1 ---> ϕ2)

⊤ ∖ eval (update_evar_val x c ρ) ((fix bevar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_evar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_evar (Nat.pred n) end | patt_bound_svar n => patt_bound_svar n | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bevar_subst psi x phi1 $ bevar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bevar_subst psi x phi1 ---> bevar_subst psi x phi2 | ex , phi' => ex , bevar_subst psi (S x) phi' | mu , phi' => mu , bevar_subst psi x phi' end) (patt_free_evar x) dbi ϕ1) ∪ eval (update_evar_val x c ρ) ((fix bevar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_evar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_evar (Nat.pred n) end | patt_bound_svar n => patt_bound_svar n | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bevar_subst psi x phi1 $ bevar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bevar_subst psi x phi1 ---> bevar_subst psi x phi2 | ex , phi' => ex , bevar_subst psi (S x) phi' | mu , phi' => mu , bevar_subst psi x phi' end) (patt_free_evar x) dbi ϕ2) = ⊤ ∖ eval (update_evar_val y c ρ) ((fix bevar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_evar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_evar (Nat.pred n) end | patt_bound_svar n => patt_bound_svar n | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bevar_subst psi x phi1 $ bevar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bevar_subst psi x phi1 ---> bevar_subst psi x phi2 | ex , phi' => ex , bevar_subst psi (S x) phi' | mu , phi' => mu , bevar_subst psi x phi' end) (patt_free_evar y) dbi ϕ1) ∪ eval (update_evar_val y c ρ) ((fix bevar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_evar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_evar (Nat.pred n) end | patt_bound_svar n => patt_bound_svar n | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bevar_subst psi x phi1 $ bevar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bevar_subst psi x phi1 ---> bevar_subst psi x phi2 | ex , phi' => ex , bevar_subst psi (S x) phi' | mu , phi' => mu , bevar_subst psi x phi' end) (patt_free_evar y) dbi ϕ2)
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ1 + size ϕ2) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ϕ1 ---> ϕ2)
Hfry: evar_is_fresh_in y (ϕ1 ---> ϕ2)

⊤ ∖ eval (update_evar_val x c ρ) ((fix bevar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_evar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_evar (Nat.pred n) end | patt_bound_svar n => patt_bound_svar n | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bevar_subst psi x phi1 $ bevar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bevar_subst psi x phi1 ---> bevar_subst psi x phi2 | ex , phi' => ex , bevar_subst psi (S x) phi' | mu , phi' => mu , bevar_subst psi x phi' end) (patt_free_evar x) dbi ϕ1) ∪ eval (update_evar_val x c ρ) ((fix bevar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_evar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_evar (Nat.pred n) end | patt_bound_svar n => patt_bound_svar n | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bevar_subst psi x phi1 $ bevar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bevar_subst psi x phi1 ---> bevar_subst psi x phi2 | ex , phi' => ex , bevar_subst psi (S x) phi' | mu , phi' => mu , bevar_subst psi x phi' end) (patt_free_evar x) dbi ϕ2) = ⊤ ∖ eval (update_evar_val y c ρ) ((fix bevar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_evar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_evar (Nat.pred n) end | patt_bound_svar n => patt_bound_svar n | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bevar_subst psi x phi1 $ bevar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bevar_subst psi x phi1 ---> bevar_subst psi x phi2 | ex , phi' => ex , bevar_subst psi (S x) phi' | mu , phi' => mu , bevar_subst psi x phi' end) (patt_free_evar y) dbi ϕ1) ∪ eval (update_evar_val y c ρ) ((fix bevar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_evar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_evar (Nat.pred n) end | patt_bound_svar n => patt_bound_svar n | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bevar_subst psi x phi1 $ bevar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bevar_subst psi x phi1 ---> bevar_subst psi x phi2 | ex , phi' => ex , bevar_subst psi (S x) phi' | mu , phi' => mu , bevar_subst psi x phi' end) (patt_free_evar y) dbi ϕ2)
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ1 + size ϕ2) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ϕ1 ---> ϕ2)
Hfry: evar_is_fresh_in y (ϕ1 ---> ϕ2)

size ϕ1 ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ1 + size ϕ2) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ϕ1 ---> ϕ2)
Hfry: evar_is_fresh_in y (ϕ1 ---> ϕ2)
evar_is_fresh_in x ϕ1
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ1 + size ϕ2) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ϕ1 ---> ϕ2)
Hfry: evar_is_fresh_in y (ϕ1 ---> ϕ2)
evar_is_fresh_in y ϕ1
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ1 + size ϕ2) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ϕ1 ---> ϕ2)
Hfry: evar_is_fresh_in y (ϕ1 ---> ϕ2)
⊤ ∖ eval (update_evar_val y c ρ) ϕ1^{evar:dbi↦y} ∪ eval (update_evar_val x c ρ) ((fix bevar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_evar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_evar (Nat.pred n) end | patt_bound_svar n => patt_bound_svar n | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bevar_subst psi x phi1 $ bevar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bevar_subst psi x phi1 ---> bevar_subst psi x phi2 | ex , phi' => ex , bevar_subst psi (S x) phi' | mu , phi' => mu , bevar_subst psi x phi' end) (patt_free_evar x) dbi ϕ2) = ⊤ ∖ eval (update_evar_val y c ρ) ((fix bevar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_evar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_evar (Nat.pred n) end | patt_bound_svar n => patt_bound_svar n | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bevar_subst psi x phi1 $ bevar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bevar_subst psi x phi1 ---> bevar_subst psi x phi2 | ex , phi' => ex , bevar_subst psi (S x) phi' | mu , phi' => mu , bevar_subst psi x phi' end) (patt_free_evar y) dbi ϕ1) ∪ eval (update_evar_val y c ρ) ((fix bevar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_evar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_evar (Nat.pred n) end | patt_bound_svar n => patt_bound_svar n | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bevar_subst psi x phi1 $ bevar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bevar_subst psi x phi1 ---> bevar_subst psi x phi2 | ex , phi' => ex , bevar_subst psi (S x) phi' | mu , phi' => mu , bevar_subst psi x phi' end) (patt_free_evar y) dbi ϕ2)
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ1 + size ϕ2) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ϕ1 ---> ϕ2)
Hfry: evar_is_fresh_in y (ϕ1 ---> ϕ2)

size ϕ1 ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ1 + size ϕ2) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ϕ1 ---> ϕ2)
Hfry: evar_is_fresh_in y (ϕ1 ---> ϕ2)
evar_is_fresh_in x ϕ1
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ1 + size ϕ2) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ϕ1 ---> ϕ2)
Hfry: evar_is_fresh_in y (ϕ1 ---> ϕ2)
evar_is_fresh_in y ϕ1
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ1 + size ϕ2) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ϕ1 ---> ϕ2)
Hfry: evar_is_fresh_in y (ϕ1 ---> ϕ2)
size ϕ2 ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ1 + size ϕ2) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ϕ1 ---> ϕ2)
Hfry: evar_is_fresh_in y (ϕ1 ---> ϕ2)
evar_is_fresh_in x ϕ2
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ1 + size ϕ2) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ϕ1 ---> ϕ2)
Hfry: evar_is_fresh_in y (ϕ1 ---> ϕ2)
evar_is_fresh_in y ϕ2
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ1 + size ϕ2) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ϕ1 ---> ϕ2)
Hfry: evar_is_fresh_in y (ϕ1 ---> ϕ2)
⊤ ∖ eval (update_evar_val y c ρ) ϕ1^{evar:dbi↦y} ∪ eval (update_evar_val y c ρ) ϕ2^{evar:dbi↦y} = ⊤ ∖ eval (update_evar_val y c ρ) ((fix bevar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_evar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_evar (Nat.pred n) end | patt_bound_svar n => patt_bound_svar n | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bevar_subst psi x phi1 $ bevar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bevar_subst psi x phi1 ---> bevar_subst psi x phi2 | ex , phi' => ex , bevar_subst psi (S x) phi' | mu , phi' => mu , bevar_subst psi x phi' end) (patt_free_evar y) dbi ϕ1) ∪ eval (update_evar_val y c ρ) ((fix bevar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_evar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_evar (Nat.pred n) end | patt_bound_svar n => patt_bound_svar n | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bevar_subst psi x phi1 $ bevar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bevar_subst psi x phi1 ---> bevar_subst psi x phi2 | ex , phi' => ex , bevar_subst psi (S x) phi' | mu , phi' => mu , bevar_subst psi x phi' end) (patt_free_evar y) dbi ϕ2)
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ1 + size ϕ2) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ϕ1 ---> ϕ2)
Hfry: evar_is_fresh_in y (ϕ1 ---> ϕ2)

evar_is_fresh_in x ϕ1
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ1 + size ϕ2) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ϕ1 ---> ϕ2)
Hfry: evar_is_fresh_in y (ϕ1 ---> ϕ2)
evar_is_fresh_in y ϕ1
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ1 + size ϕ2) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ϕ1 ---> ϕ2)
Hfry: evar_is_fresh_in y (ϕ1 ---> ϕ2)
size ϕ2 ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ1 + size ϕ2) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ϕ1 ---> ϕ2)
Hfry: evar_is_fresh_in y (ϕ1 ---> ϕ2)
evar_is_fresh_in x ϕ2
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ1 + size ϕ2) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ϕ1 ---> ϕ2)
Hfry: evar_is_fresh_in y (ϕ1 ---> ϕ2)
evar_is_fresh_in y ϕ2
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ1 + size ϕ2) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ϕ1 ---> ϕ2)
Hfry: evar_is_fresh_in y (ϕ1 ---> ϕ2)
⊤ ∖ eval (update_evar_val y c ρ) ϕ1^{evar:dbi↦y} ∪ eval (update_evar_val y c ρ) ϕ2^{evar:dbi↦y} = ⊤ ∖ eval (update_evar_val y c ρ) ((fix bevar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_evar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_evar (Nat.pred n) end | patt_bound_svar n => patt_bound_svar n | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bevar_subst psi x phi1 $ bevar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bevar_subst psi x phi1 ---> bevar_subst psi x phi2 | ex , phi' => ex , bevar_subst psi (S x) phi' | mu , phi' => mu , bevar_subst psi x phi' end) (patt_free_evar y) dbi ϕ1) ∪ eval (update_evar_val y c ρ) ((fix bevar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_evar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_evar (Nat.pred n) end | patt_bound_svar n => patt_bound_svar n | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bevar_subst psi x phi1 $ bevar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bevar_subst psi x phi1 ---> bevar_subst psi x phi2 | ex , phi' => ex , bevar_subst psi (S x) phi' | mu , phi' => mu , bevar_subst psi x phi' end) (patt_free_evar y) dbi ϕ2)
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ1 + size ϕ2) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ϕ1 ---> ϕ2)
Hfry: evar_is_fresh_in y (ϕ1 ---> ϕ2)

evar_is_fresh_in x (ϕ1 $ ?ϕ₂)
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ1 + size ϕ2) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ϕ1 ---> ϕ2)
Hfry: evar_is_fresh_in y (ϕ1 ---> ϕ2)
evar_is_fresh_in y ϕ1
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ1 + size ϕ2) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ϕ1 ---> ϕ2)
Hfry: evar_is_fresh_in y (ϕ1 ---> ϕ2)
size ϕ2 ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ1 + size ϕ2) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ϕ1 ---> ϕ2)
Hfry: evar_is_fresh_in y (ϕ1 ---> ϕ2)
evar_is_fresh_in x ϕ2
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ1 + size ϕ2) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ϕ1 ---> ϕ2)
Hfry: evar_is_fresh_in y (ϕ1 ---> ϕ2)
evar_is_fresh_in y ϕ2
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ1 + size ϕ2) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ϕ1 ---> ϕ2)
Hfry: evar_is_fresh_in y (ϕ1 ---> ϕ2)
⊤ ∖ eval (update_evar_val y c ρ) ϕ1^{evar:dbi↦y} ∪ eval (update_evar_val y c ρ) ϕ2^{evar:dbi↦y} = ⊤ ∖ eval (update_evar_val y c ρ) ((fix bevar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_evar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_evar (Nat.pred n) end | patt_bound_svar n => patt_bound_svar n | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bevar_subst psi x phi1 $ bevar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bevar_subst psi x phi1 ---> bevar_subst psi x phi2 | ex , phi' => ex , bevar_subst psi (S x) phi' | mu , phi' => mu , bevar_subst psi x phi' end) (patt_free_evar y) dbi ϕ1) ∪ eval (update_evar_val y c ρ) ((fix bevar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_evar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_evar (Nat.pred n) end | patt_bound_svar n => patt_bound_svar n | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bevar_subst psi x phi1 $ bevar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bevar_subst psi x phi1 ---> bevar_subst psi x phi2 | ex , phi' => ex , bevar_subst psi (S x) phi' | mu , phi' => mu , bevar_subst psi x phi' end) (patt_free_evar y) dbi ϕ2)
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ1 + size ϕ2) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ϕ1 ---> ϕ2)
Hfry: evar_is_fresh_in y (ϕ1 ---> ϕ2)

evar_is_fresh_in y ϕ1
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ1 + size ϕ2) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ϕ1 ---> ϕ2)
Hfry: evar_is_fresh_in y (ϕ1 ---> ϕ2)
size ϕ2 ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ1 + size ϕ2) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ϕ1 ---> ϕ2)
Hfry: evar_is_fresh_in y (ϕ1 ---> ϕ2)
evar_is_fresh_in x ϕ2
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ1 + size ϕ2) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ϕ1 ---> ϕ2)
Hfry: evar_is_fresh_in y (ϕ1 ---> ϕ2)
evar_is_fresh_in y ϕ2
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ1 + size ϕ2) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ϕ1 ---> ϕ2)
Hfry: evar_is_fresh_in y (ϕ1 ---> ϕ2)
⊤ ∖ eval (update_evar_val y c ρ) ϕ1^{evar:dbi↦y} ∪ eval (update_evar_val y c ρ) ϕ2^{evar:dbi↦y} = ⊤ ∖ eval (update_evar_val y c ρ) ((fix bevar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_evar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_evar (Nat.pred n) end | patt_bound_svar n => patt_bound_svar n | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bevar_subst psi x phi1 $ bevar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bevar_subst psi x phi1 ---> bevar_subst psi x phi2 | ex , phi' => ex , bevar_subst psi (S x) phi' | mu , phi' => mu , bevar_subst psi x phi' end) (patt_free_evar y) dbi ϕ1) ∪ eval (update_evar_val y c ρ) ((fix bevar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_evar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_evar (Nat.pred n) end | patt_bound_svar n => patt_bound_svar n | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bevar_subst psi x phi1 $ bevar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bevar_subst psi x phi1 ---> bevar_subst psi x phi2 | ex , phi' => ex , bevar_subst psi (S x) phi' | mu , phi' => mu , bevar_subst psi x phi' end) (patt_free_evar y) dbi ϕ2)
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ1 + size ϕ2) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ϕ1 ---> ϕ2)
Hfry: evar_is_fresh_in y (ϕ1 ---> ϕ2)

evar_is_fresh_in y (ϕ1 $ ?ϕ₂)
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ1 + size ϕ2) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ϕ1 ---> ϕ2)
Hfry: evar_is_fresh_in y (ϕ1 ---> ϕ2)
size ϕ2 ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ1 + size ϕ2) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ϕ1 ---> ϕ2)
Hfry: evar_is_fresh_in y (ϕ1 ---> ϕ2)
evar_is_fresh_in x ϕ2
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ1 + size ϕ2) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ϕ1 ---> ϕ2)
Hfry: evar_is_fresh_in y (ϕ1 ---> ϕ2)
evar_is_fresh_in y ϕ2
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ1 + size ϕ2) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ϕ1 ---> ϕ2)
Hfry: evar_is_fresh_in y (ϕ1 ---> ϕ2)
⊤ ∖ eval (update_evar_val y c ρ) ϕ1^{evar:dbi↦y} ∪ eval (update_evar_val y c ρ) ϕ2^{evar:dbi↦y} = ⊤ ∖ eval (update_evar_val y c ρ) ((fix bevar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_evar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_evar (Nat.pred n) end | patt_bound_svar n => patt_bound_svar n | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bevar_subst psi x phi1 $ bevar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bevar_subst psi x phi1 ---> bevar_subst psi x phi2 | ex , phi' => ex , bevar_subst psi (S x) phi' | mu , phi' => mu , bevar_subst psi x phi' end) (patt_free_evar y) dbi ϕ1) ∪ eval (update_evar_val y c ρ) ((fix bevar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_evar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_evar (Nat.pred n) end | patt_bound_svar n => patt_bound_svar n | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bevar_subst psi x phi1 $ bevar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bevar_subst psi x phi1 ---> bevar_subst psi x phi2 | ex , phi' => ex , bevar_subst psi (S x) phi' | mu , phi' => mu , bevar_subst psi x phi' end) (patt_free_evar y) dbi ϕ2)
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ1 + size ϕ2) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ϕ1 ---> ϕ2)
Hfry: evar_is_fresh_in y (ϕ1 ---> ϕ2)

size ϕ2 ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ1 + size ϕ2) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ϕ1 ---> ϕ2)
Hfry: evar_is_fresh_in y (ϕ1 ---> ϕ2)
evar_is_fresh_in x ϕ2
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ1 + size ϕ2) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ϕ1 ---> ϕ2)
Hfry: evar_is_fresh_in y (ϕ1 ---> ϕ2)
evar_is_fresh_in y ϕ2
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ1 + size ϕ2) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ϕ1 ---> ϕ2)
Hfry: evar_is_fresh_in y (ϕ1 ---> ϕ2)
⊤ ∖ eval (update_evar_val y c ρ) ϕ1^{evar:dbi↦y} ∪ eval (update_evar_val y c ρ) ϕ2^{evar:dbi↦y} = ⊤ ∖ eval (update_evar_val y c ρ) ((fix bevar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_evar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_evar (Nat.pred n) end | patt_bound_svar n => patt_bound_svar n | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bevar_subst psi x phi1 $ bevar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bevar_subst psi x phi1 ---> bevar_subst psi x phi2 | ex , phi' => ex , bevar_subst psi (S x) phi' | mu , phi' => mu , bevar_subst psi x phi' end) (patt_free_evar y) dbi ϕ1) ∪ eval (update_evar_val y c ρ) ((fix bevar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_evar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_evar (Nat.pred n) end | patt_bound_svar n => patt_bound_svar n | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bevar_subst psi x phi1 $ bevar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bevar_subst psi x phi1 ---> bevar_subst psi x phi2 | ex , phi' => ex , bevar_subst psi (S x) phi' | mu , phi' => mu , bevar_subst psi x phi' end) (patt_free_evar y) dbi ϕ2)
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ1 + size ϕ2) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ϕ1 ---> ϕ2)
Hfry: evar_is_fresh_in y (ϕ1 ---> ϕ2)

evar_is_fresh_in x ϕ2
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ1 + size ϕ2) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ϕ1 ---> ϕ2)
Hfry: evar_is_fresh_in y (ϕ1 ---> ϕ2)
evar_is_fresh_in y ϕ2
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ1 + size ϕ2) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ϕ1 ---> ϕ2)
Hfry: evar_is_fresh_in y (ϕ1 ---> ϕ2)
⊤ ∖ eval (update_evar_val y c ρ) ϕ1^{evar:dbi↦y} ∪ eval (update_evar_val y c ρ) ϕ2^{evar:dbi↦y} = ⊤ ∖ eval (update_evar_val y c ρ) ((fix bevar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_evar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_evar (Nat.pred n) end | patt_bound_svar n => patt_bound_svar n | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bevar_subst psi x phi1 $ bevar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bevar_subst psi x phi1 ---> bevar_subst psi x phi2 | ex , phi' => ex , bevar_subst psi (S x) phi' | mu , phi' => mu , bevar_subst psi x phi' end) (patt_free_evar y) dbi ϕ1) ∪ eval (update_evar_val y c ρ) ((fix bevar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_evar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_evar (Nat.pred n) end | patt_bound_svar n => patt_bound_svar n | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bevar_subst psi x phi1 $ bevar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bevar_subst psi x phi1 ---> bevar_subst psi x phi2 | ex , phi' => ex , bevar_subst psi (S x) phi' | mu , phi' => mu , bevar_subst psi x phi' end) (patt_free_evar y) dbi ϕ2)
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ1 + size ϕ2) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ϕ1 ---> ϕ2)
Hfry: evar_is_fresh_in y (ϕ1 ---> ϕ2)

evar_is_fresh_in x (?ϕ₁ $ ϕ2)
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ1 + size ϕ2) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ϕ1 ---> ϕ2)
Hfry: evar_is_fresh_in y (ϕ1 ---> ϕ2)
evar_is_fresh_in y ϕ2
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ1 + size ϕ2) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ϕ1 ---> ϕ2)
Hfry: evar_is_fresh_in y (ϕ1 ---> ϕ2)
⊤ ∖ eval (update_evar_val y c ρ) ϕ1^{evar:dbi↦y} ∪ eval (update_evar_val y c ρ) ϕ2^{evar:dbi↦y} = ⊤ ∖ eval (update_evar_val y c ρ) ((fix bevar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_evar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_evar (Nat.pred n) end | patt_bound_svar n => patt_bound_svar n | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bevar_subst psi x phi1 $ bevar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bevar_subst psi x phi1 ---> bevar_subst psi x phi2 | ex , phi' => ex , bevar_subst psi (S x) phi' | mu , phi' => mu , bevar_subst psi x phi' end) (patt_free_evar y) dbi ϕ1) ∪ eval (update_evar_val y c ρ) ((fix bevar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_evar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_evar (Nat.pred n) end | patt_bound_svar n => patt_bound_svar n | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bevar_subst psi x phi1 $ bevar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bevar_subst psi x phi1 ---> bevar_subst psi x phi2 | ex , phi' => ex , bevar_subst psi (S x) phi' | mu , phi' => mu , bevar_subst psi x phi' end) (patt_free_evar y) dbi ϕ2)
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ1 + size ϕ2) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ϕ1 ---> ϕ2)
Hfry: evar_is_fresh_in y (ϕ1 ---> ϕ2)

evar_is_fresh_in y ϕ2
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ1 + size ϕ2) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ϕ1 ---> ϕ2)
Hfry: evar_is_fresh_in y (ϕ1 ---> ϕ2)
⊤ ∖ eval (update_evar_val y c ρ) ϕ1^{evar:dbi↦y} ∪ eval (update_evar_val y c ρ) ϕ2^{evar:dbi↦y} = ⊤ ∖ eval (update_evar_val y c ρ) ((fix bevar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_evar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_evar (Nat.pred n) end | patt_bound_svar n => patt_bound_svar n | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bevar_subst psi x phi1 $ bevar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bevar_subst psi x phi1 ---> bevar_subst psi x phi2 | ex , phi' => ex , bevar_subst psi (S x) phi' | mu , phi' => mu , bevar_subst psi x phi' end) (patt_free_evar y) dbi ϕ1) ∪ eval (update_evar_val y c ρ) ((fix bevar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_evar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_evar (Nat.pred n) end | patt_bound_svar n => patt_bound_svar n | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bevar_subst psi x phi1 $ bevar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bevar_subst psi x phi1 ---> bevar_subst psi x phi2 | ex , phi' => ex , bevar_subst psi (S x) phi' | mu , phi' => mu , bevar_subst psi x phi' end) (patt_free_evar y) dbi ϕ2)
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ1 + size ϕ2) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ϕ1 ---> ϕ2)
Hfry: evar_is_fresh_in y (ϕ1 ---> ϕ2)

evar_is_fresh_in y (?ϕ₁ $ ϕ2)
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ1 + size ϕ2) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ϕ1 ---> ϕ2)
Hfry: evar_is_fresh_in y (ϕ1 ---> ϕ2)
⊤ ∖ eval (update_evar_val y c ρ) ϕ1^{evar:dbi↦y} ∪ eval (update_evar_val y c ρ) ϕ2^{evar:dbi↦y} = ⊤ ∖ eval (update_evar_val y c ρ) ((fix bevar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_evar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_evar (Nat.pred n) end | patt_bound_svar n => patt_bound_svar n | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bevar_subst psi x phi1 $ bevar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bevar_subst psi x phi1 ---> bevar_subst psi x phi2 | ex , phi' => ex , bevar_subst psi (S x) phi' | mu , phi' => mu , bevar_subst psi x phi' end) (patt_free_evar y) dbi ϕ1) ∪ eval (update_evar_val y c ρ) ((fix bevar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_evar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_evar (Nat.pred n) end | patt_bound_svar n => patt_bound_svar n | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bevar_subst psi x phi1 $ bevar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bevar_subst psi x phi1 ---> bevar_subst psi x phi2 | ex , phi' => ex , bevar_subst psi (S x) phi' | mu , phi' => mu , bevar_subst psi x phi' end) (patt_free_evar y) dbi ϕ2)
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ1, ϕ2: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ1 + size ϕ2) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ϕ1 ---> ϕ2)
Hfry: evar_is_fresh_in y (ϕ1 ---> ϕ2)

⊤ ∖ eval (update_evar_val y c ρ) ϕ1^{evar:dbi↦y} ∪ eval (update_evar_val y c ρ) ϕ2^{evar:dbi↦y} = ⊤ ∖ eval (update_evar_val y c ρ) ((fix bevar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_evar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_evar (Nat.pred n) end | patt_bound_svar n => patt_bound_svar n | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bevar_subst psi x phi1 $ bevar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bevar_subst psi x phi1 ---> bevar_subst psi x phi2 | ex , phi' => ex , bevar_subst psi (S x) phi' | mu , phi' => mu , bevar_subst psi x phi' end) (patt_free_evar y) dbi ϕ1) ∪ eval (update_evar_val y c ρ) ((fix bevar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_evar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_evar (Nat.pred n) end | patt_bound_svar n => patt_bound_svar n | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bevar_subst psi x phi1 $ bevar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bevar_subst psi x phi1 ---> bevar_subst psi x phi2 | ex , phi' => ex , bevar_subst psi (S x) phi' | mu , phi' => mu , bevar_subst psi x phi' end) (patt_free_evar y) dbi ϕ2)
reflexivity.
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , ϕ)
Hfry: evar_is_fresh_in y (ex , ϕ)

eval (update_evar_val x c ρ) (ex , ϕ)^{evar:dbi↦x} = eval (update_evar_val y c ρ) (ex , ϕ)^{evar:dbi↦y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , ϕ)
Hfry: evar_is_fresh_in y (ex , ϕ)

eval (update_evar_val x c ρ) (ex , ϕ^{evar:S dbi↦x}) = eval (update_evar_val y c ρ) (ex , ϕ^{evar:increase_ex pm_spec_data dbi↦y})
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , ϕ)
Hfry: evar_is_fresh_in y (ex , ϕ)

eval (update_evar_val x c ρ) (ex , ϕ^{evar:S dbi↦x}) = eval (update_evar_val y c ρ) (ex , ϕ^{evar:S dbi↦y})
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , ϕ)
Hfry: evar_is_fresh_in y (ex , ϕ)

(let x0 := fresh_evar ϕ^{evar:S dbi↦x} in propset_fa_union (λ e : M, let ρ' := update_evar_val x0 e (update_evar_val x c ρ) in eval ρ' ϕ^{evar:S dbi↦x}^{evar:0↦x0})) = (let x := fresh_evar ϕ^{evar:S dbi↦y} in propset_fa_union (λ e : M, let ρ' := update_evar_val x e (update_evar_val y c ρ) in eval ρ' ϕ^{evar:S dbi↦y}^{evar:0↦x}))
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , ϕ)
Hfry: evar_is_fresh_in y (ex , ϕ)

(let x0 := fresh_evar ϕ^{evar:S dbi↦x} in propset_fa_union (λ e : M, let ρ' := update_evar_val x0 e (update_evar_val x c ρ) in eval ρ' ϕ^{evar:S dbi↦x}^{evar:0↦x0})) = (let x := fresh_evar ϕ^{evar:S dbi↦y} in propset_fa_union (λ e : M, let ρ' := update_evar_val x e (update_evar_val y c ρ) in eval ρ' ϕ^{evar:S dbi↦y}^{evar:0↦x}))
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , ϕ)
Hfry: evar_is_fresh_in y (ex , ϕ)

propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ^{evar:S dbi↦x}) e (update_evar_val x c ρ)) ϕ^{evar:S dbi↦x}^{evar:0↦fresh_evar ϕ^{evar:S dbi↦x}}) = propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ϕ^{evar:S dbi↦y}) e (update_evar_val y c ρ)) ϕ^{evar:S dbi↦y}^{evar:0↦fresh_evar ϕ^{evar:S dbi↦y}})
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , ϕ)
Hfry: evar_is_fresh_in y (ex , ϕ)

(λ e : M, eval (update_evar_val (fresh_evar ϕ^{evar:S dbi↦x}) e (update_evar_val x c ρ)) ϕ^{evar:S dbi↦x}^{evar:0↦fresh_evar ϕ^{evar:S dbi↦x}}) = (λ e : M, eval (update_evar_val (fresh_evar ϕ^{evar:S dbi↦y}) e (update_evar_val y c ρ)) ϕ^{evar:S dbi↦y}^{evar:0↦fresh_evar ϕ^{evar:S dbi↦y}})
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , ϕ)
Hfry: evar_is_fresh_in y (ex , ϕ)

x0 : M, eval (update_evar_val (fresh_evar ϕ^{evar:S dbi↦x}) x0 (update_evar_val x c ρ)) ϕ^{evar:S dbi↦x}^{evar:0↦fresh_evar ϕ^{evar:S dbi↦x}} = eval (update_evar_val (fresh_evar ϕ^{evar:S dbi↦y}) x0 (update_evar_val y c ρ)) ϕ^{evar:S dbi↦y}^{evar:0↦fresh_evar ϕ^{evar:S dbi↦y}}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , ϕ)
Hfry: evar_is_fresh_in y (ex , ϕ)
e: M

eval (update_evar_val (fresh_evar ϕ^{evar:S dbi↦x}) e (update_evar_val x c ρ)) ϕ^{evar:S dbi↦x}^{evar:0↦fresh_evar ϕ^{evar:S dbi↦x}} = eval (update_evar_val (fresh_evar ϕ^{evar:S dbi↦y}) e (update_evar_val y c ρ)) ϕ^{evar:S dbi↦y}^{evar:0↦fresh_evar ϕ^{evar:S dbi↦y}}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , ϕ)
Hfry: evar_is_fresh_in y (ex , ϕ)
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}

eval (update_evar_val x' e (update_evar_val x c ρ)) ϕ^{evar:S dbi↦x}^{evar:0↦x'} = eval (update_evar_val (fresh_evar ϕ^{evar:S dbi↦y}) e (update_evar_val y c ρ)) ϕ^{evar:S dbi↦y}^{evar:0↦fresh_evar ϕ^{evar:S dbi↦y}}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , ϕ)
Hfry: evar_is_fresh_in y (ex , ϕ)
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}

eval (update_evar_val x' e (update_evar_val x c ρ)) ϕ^{evar:S dbi↦x}^{evar:0↦x'} = eval (update_evar_val y' e (update_evar_val y c ρ)) ϕ^{evar:S dbi↦y}^{evar:0↦y'}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , ϕ)
Hfry: evar_is_fresh_in y (ex , ϕ)
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
B: EVarSet
HeqB: B = {[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ)))))

eval (update_evar_val x' e (update_evar_val x c ρ)) ϕ^{evar:S dbi↦x}^{evar:0↦x'} = eval (update_evar_val y' e (update_evar_val y c ρ)) ϕ^{evar:S dbi↦y}^{evar:0↦y'}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , ϕ)
Hfry: evar_is_fresh_in y (ex , ϕ)
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
B: EVarSet
HeqB: B = {[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ)))))
fresh3: evar
Heqfresh3: fresh3 = evar_fresh (elements B)

eval (update_evar_val x' e (update_evar_val x c ρ)) ϕ^{evar:S dbi↦x}^{evar:0↦x'} = eval (update_evar_val y' e (update_evar_val y c ρ)) ϕ^{evar:S dbi↦y}^{evar:0↦y'}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , ϕ)
Hfry: evar_is_fresh_in y (ex , ϕ)
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
B: EVarSet
HeqB: B = {[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ)))))
fresh3: evar
Heqfresh3: fresh3 = evar_fresh (elements B)

fresh3 ∉ B
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , ϕ)
Hfry: evar_is_fresh_in y (ex , ϕ)
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
B: EVarSet
HeqB: B = {[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ)))))
fresh3: evar
Heqfresh3: fresh3 = evar_fresh (elements B)
HB: fresh3 ∉ B
eval (update_evar_val x' e (update_evar_val x c ρ)) ϕ^{evar:S dbi↦x}^{evar:0↦x'} = eval (update_evar_val y' e (update_evar_val y c ρ)) ϕ^{evar:S dbi↦y}^{evar:0↦y'}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , ϕ)
Hfry: evar_is_fresh_in y (ex , ϕ)
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
B: EVarSet
HeqB: B = {[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ)))))
fresh3: evar
Heqfresh3: fresh3 = evar_fresh (elements B)

fresh3 ∉ B
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , ϕ)
Hfry: evar_is_fresh_in y (ex , ϕ)
e: M

evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[fresh_evar ϕ^{evar:S dbi↦x}]} ∪ ({[fresh_evar ϕ^{evar:S dbi↦y}]} ∪ (free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ))))))) ∉ {[x]} ∪ ({[y]} ∪ ({[fresh_evar ϕ^{evar:S dbi↦x}]} ∪ ({[fresh_evar ϕ^{evar:S dbi↦y}]} ∪ (free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ)))))
apply set_evar_fresh_is_fresh'.
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , ϕ)
Hfry: evar_is_fresh_in y (ex , ϕ)
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
B: EVarSet
HeqB: B = {[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ)))))
fresh3: evar
Heqfresh3: fresh3 = evar_fresh (elements B)
HB: fresh3 ∉ B

eval (update_evar_val x' e (update_evar_val x c ρ)) ϕ^{evar:S dbi↦x}^{evar:0↦x'} = eval (update_evar_val y' e (update_evar_val y c ρ)) ϕ^{evar:S dbi↦y}^{evar:0↦y'}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , ϕ)
Hfry: evar_is_fresh_in y (ex , ϕ)
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
B, B0: EVarSet
HeqB0: B0 = free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ
HeqB: B = {[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar:S dbi↦x} ∪ B0))))
fresh3: evar
Heqfresh3: fresh3 = evar_fresh (elements B)
HB: fresh3 ∉ B

eval (update_evar_val x' e (update_evar_val x c ρ)) ϕ^{evar:S dbi↦x}^{evar:0↦x'} = eval (update_evar_val y' e (update_evar_val y c ρ)) ϕ^{evar:S dbi↦y}^{evar:0↦y'}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , ϕ)
Hfry: evar_is_fresh_in y (ex , ϕ)
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
B, B0: EVarSet
HeqB0: B0 = free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ
B1: EVarSet
HeqB1: B1 = free_evars ϕ^{evar:S dbi↦x} ∪ B0
HeqB: B = {[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ B1)))
fresh3: evar
Heqfresh3: fresh3 = evar_fresh (elements B)
HB: fresh3 ∉ B

eval (update_evar_val x' e (update_evar_val x c ρ)) ϕ^{evar:S dbi↦x}^{evar:0↦x'} = eval (update_evar_val y' e (update_evar_val y c ρ)) ϕ^{evar:S dbi↦y}^{evar:0↦y'}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , ϕ)
Hfry: evar_is_fresh_in y (ex , ϕ)
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
B, B0: EVarSet
HeqB0: B0 = free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ
B1: EVarSet
HeqB1: B1 = free_evars ϕ^{evar:S dbi↦x} ∪ B0
B2: EVarSet
HeqB2: B2 = {[y']} ∪ B1
HeqB: B = {[x]} ∪ ({[y]} ∪ ({[x']} ∪ B2))
fresh3: evar
Heqfresh3: fresh3 = evar_fresh (elements B)
HB: fresh3 ∉ B

eval (update_evar_val x' e (update_evar_val x c ρ)) ϕ^{evar:S dbi↦x}^{evar:0↦x'} = eval (update_evar_val y' e (update_evar_val y c ρ)) ϕ^{evar:S dbi↦y}^{evar:0↦y'}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , ϕ)
Hfry: evar_is_fresh_in y (ex , ϕ)
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
B, B0: EVarSet
HeqB0: B0 = free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ
B1: EVarSet
HeqB1: B1 = free_evars ϕ^{evar:S dbi↦x} ∪ B0
B2: EVarSet
HeqB2: B2 = {[y']} ∪ B1
B3: EVarSet
HeqB3: B3 = {[x']} ∪ B2
HeqB: B = {[x]} ∪ ({[y]} ∪ B3)
fresh3: evar
Heqfresh3: fresh3 = evar_fresh (elements B)
HB: fresh3 ∉ B

eval (update_evar_val x' e (update_evar_val x c ρ)) ϕ^{evar:S dbi↦x}^{evar:0↦x'} = eval (update_evar_val y' e (update_evar_val y c ρ)) ϕ^{evar:S dbi↦y}^{evar:0↦y'}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , ϕ)
Hfry: evar_is_fresh_in y (ex , ϕ)
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
B, B0: EVarSet
HeqB0: B0 = free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ
B1: EVarSet
HeqB1: B1 = free_evars ϕ^{evar:S dbi↦x} ∪ B0
B2: EVarSet
HeqB2: B2 = {[y']} ∪ B1
B3: EVarSet
HeqB3: B3 = {[x']} ∪ B2
B4: EVarSet
HeqB4: B4 = {[y]} ∪ B3
HeqB: B = {[x]} ∪ B4
fresh3: evar
Heqfresh3: fresh3 = evar_fresh (elements B)
HB: fresh3 ∉ B

eval (update_evar_val x' e (update_evar_val x c ρ)) ϕ^{evar:S dbi↦x}^{evar:0↦x'} = eval (update_evar_val y' e (update_evar_val y c ρ)) ϕ^{evar:S dbi↦y}^{evar:0↦y'}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , ϕ)
Hfry: evar_is_fresh_in y (ex , ϕ)
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
B, B0: EVarSet
HeqB0: B0 = free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ
B1: EVarSet
HeqB1: B1 = free_evars ϕ^{evar:S dbi↦x} ∪ B0
B2: EVarSet
HeqB2: B2 = {[y']} ∪ B1
B3: EVarSet
HeqB3: B3 = {[x']} ∪ B2
B4: EVarSet
HeqB4: B4 = {[y]} ∪ B3
HeqB: B = {[x]} ∪ B4
fresh3: evar
Heqfresh3: fresh3 = evar_fresh (elements B)
HB: fresh3 ∉ B
i: fresh3 ∉ {[x]} ∪ B4 ↔ (fresh3 ∉ {[x]}) ∧ fresh3 ∉ B4

eval (update_evar_val x' e (update_evar_val x c ρ)) ϕ^{evar:S dbi↦x}^{evar:0↦x'} = eval (update_evar_val y' e (update_evar_val y c ρ)) ϕ^{evar:S dbi↦y}^{evar:0↦y'}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , ϕ)
Hfry: evar_is_fresh_in y (ex , ϕ)
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
B, B0: EVarSet
HeqB0: B0 = free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ
B1: EVarSet
HeqB1: B1 = free_evars ϕ^{evar:S dbi↦x} ∪ B0
B2: EVarSet
HeqB2: B2 = {[y']} ∪ B1
B3: EVarSet
HeqB3: B3 = {[x']} ∪ B2
B4: EVarSet
HeqB4: B4 = {[y]} ∪ B3
HeqB: B = {[x]} ∪ B4
fresh3: evar
Heqfresh3: fresh3 = evar_fresh (elements B)
HB: fresh3 ∉ B
i: fresh3 ∉ {[x]} ∪ B4 ↔ (fresh3 ∉ {[x]}) ∧ fresh3 ∉ B4
i0: fresh3 ∉ {[y]} ∪ B3 ↔ (fresh3 ∉ {[y]}) ∧ fresh3 ∉ B3

eval (update_evar_val x' e (update_evar_val x c ρ)) ϕ^{evar:S dbi↦x}^{evar:0↦x'} = eval (update_evar_val y' e (update_evar_val y c ρ)) ϕ^{evar:S dbi↦y}^{evar:0↦y'}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , ϕ)
Hfry: evar_is_fresh_in y (ex , ϕ)
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
B, B0: EVarSet
HeqB0: B0 = free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ
B1: EVarSet
HeqB1: B1 = free_evars ϕ^{evar:S dbi↦x} ∪ B0
B2: EVarSet
HeqB2: B2 = {[y']} ∪ B1
B3: EVarSet
HeqB3: B3 = {[x']} ∪ B2
B4: EVarSet
HeqB4: B4 = {[y]} ∪ B3
HeqB: B = {[x]} ∪ B4
fresh3: evar
Heqfresh3: fresh3 = evar_fresh (elements B)
HB: fresh3 ∉ B
i: fresh3 ∉ {[x]} ∪ B4 ↔ (fresh3 ∉ {[x]}) ∧ fresh3 ∉ B4
i0: fresh3 ∉ {[y]} ∪ B3 ↔ (fresh3 ∉ {[y]}) ∧ fresh3 ∉ B3
i1: fresh3 ∉ {[x']} ∪ B2 ↔ (fresh3 ∉ {[x']}) ∧ fresh3 ∉ B2

eval (update_evar_val x' e (update_evar_val x c ρ)) ϕ^{evar:S dbi↦x}^{evar:0↦x'} = eval (update_evar_val y' e (update_evar_val y c ρ)) ϕ^{evar:S dbi↦y}^{evar:0↦y'}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , ϕ)
Hfry: evar_is_fresh_in y (ex , ϕ)
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
B, B0: EVarSet
HeqB0: B0 = free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ
B1: EVarSet
HeqB1: B1 = free_evars ϕ^{evar:S dbi↦x} ∪ B0
B2: EVarSet
HeqB2: B2 = {[y']} ∪ B1
B3: EVarSet
HeqB3: B3 = {[x']} ∪ B2
B4: EVarSet
HeqB4: B4 = {[y]} ∪ B3
HeqB: B = {[x]} ∪ B4
fresh3: evar
Heqfresh3: fresh3 = evar_fresh (elements B)
HB: fresh3 ∉ B
i: fresh3 ∉ {[x]} ∪ B4 ↔ (fresh3 ∉ {[x]}) ∧ fresh3 ∉ B4
i0: fresh3 ∉ {[y]} ∪ B3 ↔ (fresh3 ∉ {[y]}) ∧ fresh3 ∉ B3
i1: fresh3 ∉ {[x']} ∪ B2 ↔ (fresh3 ∉ {[x']}) ∧ fresh3 ∉ B2
i2: fresh3 ∉ {[y']} ∪ B1 ↔ (fresh3 ∉ {[y']}) ∧ fresh3 ∉ B1

eval (update_evar_val x' e (update_evar_val x c ρ)) ϕ^{evar:S dbi↦x}^{evar:0↦x'} = eval (update_evar_val y' e (update_evar_val y c ρ)) ϕ^{evar:S dbi↦y}^{evar:0↦y'}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , ϕ)
Hfry: evar_is_fresh_in y (ex , ϕ)
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
B, B0: EVarSet
HeqB0: B0 = free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ
B1: EVarSet
HeqB1: B1 = free_evars ϕ^{evar:S dbi↦x} ∪ B0
B2: EVarSet
HeqB2: B2 = {[y']} ∪ B1
B3: EVarSet
HeqB3: B3 = {[x']} ∪ B2
B4: EVarSet
HeqB4: B4 = {[y]} ∪ B3
HeqB: B = {[x]} ∪ B4
fresh3: evar
Heqfresh3: fresh3 = evar_fresh (elements B)
HB: fresh3 ∉ B
i: fresh3 ∉ {[x]} ∪ B4 ↔ (fresh3 ∉ {[x]}) ∧ fresh3 ∉ B4
i0: fresh3 ∉ {[y]} ∪ B3 ↔ (fresh3 ∉ {[y]}) ∧ fresh3 ∉ B3
i1: fresh3 ∉ {[x']} ∪ B2 ↔ (fresh3 ∉ {[x']}) ∧ fresh3 ∉ B2
i2: fresh3 ∉ {[y']} ∪ B1 ↔ (fresh3 ∉ {[y']}) ∧ fresh3 ∉ B1
i3: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} ∪ B0 ↔ (fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}) ∧ fresh3 ∉ B0

eval (update_evar_val x' e (update_evar_val x c ρ)) ϕ^{evar:S dbi↦x}^{evar:0↦x'} = eval (update_evar_val y' e (update_evar_val y c ρ)) ϕ^{evar:S dbi↦y}^{evar:0↦y'}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , ϕ)
Hfry: evar_is_fresh_in y (ex , ϕ)
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
B, B1: EVarSet
HeqB1: B1 = free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ)
B2: EVarSet
HeqB2: B2 = {[y']} ∪ B1
B3: EVarSet
HeqB3: B3 = {[x']} ∪ B2
B4: EVarSet
HeqB4: B4 = {[y]} ∪ B3
HeqB: B = {[x]} ∪ B4
fresh3: evar
Heqfresh3: fresh3 = evar_fresh (elements B)
HB: fresh3 ∉ B
i: fresh3 ∉ {[x]} ∪ B4 ↔ (fresh3 ∉ {[x]}) ∧ fresh3 ∉ B4
i0: fresh3 ∉ {[y]} ∪ B3 ↔ (fresh3 ∉ {[y]}) ∧ fresh3 ∉ B3
i1: fresh3 ∉ {[x']} ∪ B2 ↔ (fresh3 ∉ {[x']}) ∧ fresh3 ∉ B2
i2: fresh3 ∉ {[y']} ∪ B1 ↔ (fresh3 ∉ {[y']}) ∧ fresh3 ∉ B1
i3: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ) ↔ (fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}) ∧ fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ

eval (update_evar_val x' e (update_evar_val x c ρ)) ϕ^{evar:S dbi↦x}^{evar:0↦x'} = eval (update_evar_val y' e (update_evar_val y c ρ)) ϕ^{evar:S dbi↦y}^{evar:0↦y'}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , ϕ)
Hfry: evar_is_fresh_in y (ex , ϕ)
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
B, B2: EVarSet
HeqB2: B2 = {[y']} ∪ (free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ))
B3: EVarSet
HeqB3: B3 = {[x']} ∪ B2
B4: EVarSet
HeqB4: B4 = {[y]} ∪ B3
HeqB: B = {[x]} ∪ B4
fresh3: evar
Heqfresh3: fresh3 = evar_fresh (elements B)
HB: fresh3 ∉ B
i: fresh3 ∉ {[x]} ∪ B4 ↔ (fresh3 ∉ {[x]}) ∧ fresh3 ∉ B4
i0: fresh3 ∉ {[y]} ∪ B3 ↔ (fresh3 ∉ {[y]}) ∧ fresh3 ∉ B3
i1: fresh3 ∉ {[x']} ∪ B2 ↔ (fresh3 ∉ {[x']}) ∧ fresh3 ∉ B2
i2: fresh3 ∉ {[y']} ∪ (free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ)) ↔ (fresh3 ∉ {[y']}) ∧ fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ)
i3: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ) ↔ (fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}) ∧ fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ

eval (update_evar_val x' e (update_evar_val x c ρ)) ϕ^{evar:S dbi↦x}^{evar:0↦x'} = eval (update_evar_val y' e (update_evar_val y c ρ)) ϕ^{evar:S dbi↦y}^{evar:0↦y'}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , ϕ)
Hfry: evar_is_fresh_in y (ex , ϕ)
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
B, B3: EVarSet
HeqB3: B3 = {[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ)))
B4: EVarSet
HeqB4: B4 = {[y]} ∪ B3
HeqB: B = {[x]} ∪ B4
fresh3: evar
Heqfresh3: fresh3 = evar_fresh (elements B)
HB: fresh3 ∉ B
i: fresh3 ∉ {[x]} ∪ B4 ↔ (fresh3 ∉ {[x]}) ∧ fresh3 ∉ B4
i0: fresh3 ∉ {[y]} ∪ B3 ↔ (fresh3 ∉ {[y]}) ∧ fresh3 ∉ B3
i1: fresh3 ∉ {[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ))) ↔ (fresh3 ∉ {[x']}) ∧ fresh3 ∉ {[y']} ∪ (free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ))
i2: fresh3 ∉ {[y']} ∪ (free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ)) ↔ (fresh3 ∉ {[y']}) ∧ fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ)
i3: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ) ↔ (fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}) ∧ fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ

eval (update_evar_val x' e (update_evar_val x c ρ)) ϕ^{evar:S dbi↦x}^{evar:0↦x'} = eval (update_evar_val y' e (update_evar_val y c ρ)) ϕ^{evar:S dbi↦y}^{evar:0↦y'}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , ϕ)
Hfry: evar_is_fresh_in y (ex , ϕ)
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
B, B4: EVarSet
HeqB4: B4 = {[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ))))
HeqB: B = {[x]} ∪ B4
fresh3: evar
Heqfresh3: fresh3 = evar_fresh (elements B)
HB: fresh3 ∉ B
i: fresh3 ∉ {[x]} ∪ B4 ↔ (fresh3 ∉ {[x]}) ∧ fresh3 ∉ B4
i0: fresh3 ∉ {[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ)))) ↔ (fresh3 ∉ {[y]}) ∧ fresh3 ∉ {[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ)))
i1: fresh3 ∉ {[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ))) ↔ (fresh3 ∉ {[x']}) ∧ fresh3 ∉ {[y']} ∪ (free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ))
i2: fresh3 ∉ {[y']} ∪ (free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ)) ↔ (fresh3 ∉ {[y']}) ∧ fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ)
i3: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ) ↔ (fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}) ∧ fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ

eval (update_evar_val x' e (update_evar_val x c ρ)) ϕ^{evar:S dbi↦x}^{evar:0↦x'} = eval (update_evar_val y' e (update_evar_val y c ρ)) ϕ^{evar:S dbi↦y}^{evar:0↦y'}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , ϕ)
Hfry: evar_is_fresh_in y (ex , ϕ)
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
B: EVarSet
HeqB: B = {[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ)))))
fresh3: evar
Heqfresh3: fresh3 = evar_fresh (elements B)
HB: fresh3 ∉ B
i: fresh3 ∉ {[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ))))) ↔ (fresh3 ∉ {[x]}) ∧ fresh3 ∉ {[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ))))
i0: fresh3 ∉ {[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ)))) ↔ (fresh3 ∉ {[y]}) ∧ fresh3 ∉ {[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ)))
i1: fresh3 ∉ {[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ))) ↔ (fresh3 ∉ {[x']}) ∧ fresh3 ∉ {[y']} ∪ (free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ))
i2: fresh3 ∉ {[y']} ∪ (free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ)) ↔ (fresh3 ∉ {[y']}) ∧ fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ)
i3: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ) ↔ (fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}) ∧ fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ

eval (update_evar_val x' e (update_evar_val x c ρ)) ϕ^{evar:S dbi↦x}^{evar:0↦x'} = eval (update_evar_val y' e (update_evar_val y c ρ)) ϕ^{evar:S dbi↦y}^{evar:0↦y'}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , ϕ)
Hfry: evar_is_fresh_in y (ex , ϕ)
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
HB: fresh3 ∉ {[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ)))))
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))
i: fresh3 ∉ {[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ))))) ↔ (fresh3 ∉ {[x]}) ∧ fresh3 ∉ {[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ))))
i0: fresh3 ∉ {[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ)))) ↔ (fresh3 ∉ {[y]}) ∧ fresh3 ∉ {[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ)))
i1: fresh3 ∉ {[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ))) ↔ (fresh3 ∉ {[x']}) ∧ fresh3 ∉ {[y']} ∪ (free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ))
i2: fresh3 ∉ {[y']} ∪ (free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ)) ↔ (fresh3 ∉ {[y']}) ∧ fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ)
i3: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ) ↔ (fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}) ∧ fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ

eval (update_evar_val x' e (update_evar_val x c ρ)) ϕ^{evar:S dbi↦x}^{evar:0↦x'} = eval (update_evar_val y' e (update_evar_val y c ρ)) ϕ^{evar:S dbi↦y}^{evar:0↦y'}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , ϕ)
Hfry: evar_is_fresh_in y (ex , ϕ)
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
HB: (fresh3 ∉ {[x]}) ∧ fresh3 ∉ {[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ))))
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))
i: fresh3 ∉ {[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ))))) ↔ (fresh3 ∉ {[x]}) ∧ fresh3 ∉ {[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ))))
i0: fresh3 ∉ {[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ)))) ↔ (fresh3 ∉ {[y]}) ∧ fresh3 ∉ {[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ)))
i1: fresh3 ∉ {[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ))) ↔ (fresh3 ∉ {[x']}) ∧ fresh3 ∉ {[y']} ∪ (free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ))
i2: fresh3 ∉ {[y']} ∪ (free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ)) ↔ (fresh3 ∉ {[y']}) ∧ fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ)
i3: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ) ↔ (fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}) ∧ fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ

eval (update_evar_val x' e (update_evar_val x c ρ)) ϕ^{evar:S dbi↦x}^{evar:0↦x'} = eval (update_evar_val y' e (update_evar_val y c ρ)) ϕ^{evar:S dbi↦y}^{evar:0↦y'}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , ϕ)
Hfry: evar_is_fresh_in y (ex , ϕ)
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
HB: (fresh3 ∉ {[x]}) ∧ fresh3 ∉ {[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ))))
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))
i0: fresh3 ∉ {[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ)))) ↔ (fresh3 ∉ {[y]}) ∧ fresh3 ∉ {[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ)))
i1: fresh3 ∉ {[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ))) ↔ (fresh3 ∉ {[x']}) ∧ fresh3 ∉ {[y']} ∪ (free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ))
i2: fresh3 ∉ {[y']} ∪ (free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ)) ↔ (fresh3 ∉ {[y']}) ∧ fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ)
i3: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ) ↔ (fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}) ∧ fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ

eval (update_evar_val x' e (update_evar_val x c ρ)) ϕ^{evar:S dbi↦x}^{evar:0↦x'} = eval (update_evar_val y' e (update_evar_val y c ρ)) ϕ^{evar:S dbi↦y}^{evar:0↦y'}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , ϕ)
Hfry: evar_is_fresh_in y (ex , ϕ)
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
Hneqfr1: fresh3 ∉ {[x]}
HB: fresh3 ∉ {[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ))))
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))
i0: fresh3 ∉ {[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ)))) ↔ (fresh3 ∉ {[y]}) ∧ fresh3 ∉ {[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ)))
i1: fresh3 ∉ {[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ))) ↔ (fresh3 ∉ {[x']}) ∧ fresh3 ∉ {[y']} ∪ (free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ))
i2: fresh3 ∉ {[y']} ∪ (free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ)) ↔ (fresh3 ∉ {[y']}) ∧ fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ)
i3: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ) ↔ (fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}) ∧ fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ

eval (update_evar_val x' e (update_evar_val x c ρ)) ϕ^{evar:S dbi↦x}^{evar:0↦x'} = eval (update_evar_val y' e (update_evar_val y c ρ)) ϕ^{evar:S dbi↦y}^{evar:0↦y'}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , ϕ)
Hfry: evar_is_fresh_in y (ex , ϕ)
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
Hneqfr1: fresh3 ≠ x
HB: fresh3 ∉ {[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ))))
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))
i0: fresh3 ∉ {[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ)))) ↔ (fresh3 ∉ {[y]}) ∧ fresh3 ∉ {[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ)))
i1: fresh3 ∉ {[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ))) ↔ (fresh3 ∉ {[x']}) ∧ fresh3 ∉ {[y']} ∪ (free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ))
i2: fresh3 ∉ {[y']} ∪ (free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ)) ↔ (fresh3 ∉ {[y']}) ∧ fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ)
i3: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ) ↔ (fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}) ∧ fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ

eval (update_evar_val x' e (update_evar_val x c ρ)) ϕ^{evar:S dbi↦x}^{evar:0↦x'} = eval (update_evar_val y' e (update_evar_val y c ρ)) ϕ^{evar:S dbi↦y}^{evar:0↦y'}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , ϕ)
Hfry: evar_is_fresh_in y (ex , ϕ)
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
Hneqfr1: fresh3 ≠ x
HB: (fresh3 ∉ {[y]}) ∧ fresh3 ∉ {[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ)))
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))
i0: fresh3 ∉ {[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ)))) ↔ (fresh3 ∉ {[y]}) ∧ fresh3 ∉ {[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ)))
i1: fresh3 ∉ {[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ))) ↔ (fresh3 ∉ {[x']}) ∧ fresh3 ∉ {[y']} ∪ (free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ))
i2: fresh3 ∉ {[y']} ∪ (free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ)) ↔ (fresh3 ∉ {[y']}) ∧ fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ)
i3: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ) ↔ (fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}) ∧ fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ

eval (update_evar_val x' e (update_evar_val x c ρ)) ϕ^{evar:S dbi↦x}^{evar:0↦x'} = eval (update_evar_val y' e (update_evar_val y c ρ)) ϕ^{evar:S dbi↦y}^{evar:0↦y'}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , ϕ)
Hfry: evar_is_fresh_in y (ex , ϕ)
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
Hneqfr1: fresh3 ≠ x
HB: (fresh3 ∉ {[y]}) ∧ fresh3 ∉ {[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ)))
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))
i1: fresh3 ∉ {[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ))) ↔ (fresh3 ∉ {[x']}) ∧ fresh3 ∉ {[y']} ∪ (free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ))
i2: fresh3 ∉ {[y']} ∪ (free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ)) ↔ (fresh3 ∉ {[y']}) ∧ fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ)
i3: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ) ↔ (fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}) ∧ fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ

eval (update_evar_val x' e (update_evar_val x c ρ)) ϕ^{evar:S dbi↦x}^{evar:0↦x'} = eval (update_evar_val y' e (update_evar_val y c ρ)) ϕ^{evar:S dbi↦y}^{evar:0↦y'}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , ϕ)
Hfry: evar_is_fresh_in y (ex , ϕ)
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
Hneqfr1: fresh3 ≠ x
Hneqfr2: fresh3 ∉ {[y]}
HB: fresh3 ∉ {[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ)))
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))
i1: fresh3 ∉ {[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ))) ↔ (fresh3 ∉ {[x']}) ∧ fresh3 ∉ {[y']} ∪ (free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ))
i2: fresh3 ∉ {[y']} ∪ (free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ)) ↔ (fresh3 ∉ {[y']}) ∧ fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ)
i3: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ) ↔ (fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}) ∧ fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ

eval (update_evar_val x' e (update_evar_val x c ρ)) ϕ^{evar:S dbi↦x}^{evar:0↦x'} = eval (update_evar_val y' e (update_evar_val y c ρ)) ϕ^{evar:S dbi↦y}^{evar:0↦y'}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , ϕ)
Hfry: evar_is_fresh_in y (ex , ϕ)
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
Hneqfr1: fresh3 ≠ x
Hneqfr2: fresh3 ≠ y
HB: fresh3 ∉ {[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ)))
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))
i1: fresh3 ∉ {[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ))) ↔ (fresh3 ∉ {[x']}) ∧ fresh3 ∉ {[y']} ∪ (free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ))
i2: fresh3 ∉ {[y']} ∪ (free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ)) ↔ (fresh3 ∉ {[y']}) ∧ fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ)
i3: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ) ↔ (fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}) ∧ fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ

eval (update_evar_val x' e (update_evar_val x c ρ)) ϕ^{evar:S dbi↦x}^{evar:0↦x'} = eval (update_evar_val y' e (update_evar_val y c ρ)) ϕ^{evar:S dbi↦y}^{evar:0↦y'}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , ϕ)
Hfry: evar_is_fresh_in y (ex , ϕ)
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
Hneqfr1: fresh3 ≠ x
Hneqfr2: fresh3 ≠ y
HB: (fresh3 ∉ {[x']}) ∧ fresh3 ∉ {[y']} ∪ (free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ))
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))
i1: fresh3 ∉ {[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ))) ↔ (fresh3 ∉ {[x']}) ∧ fresh3 ∉ {[y']} ∪ (free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ))
i2: fresh3 ∉ {[y']} ∪ (free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ)) ↔ (fresh3 ∉ {[y']}) ∧ fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ)
i3: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ) ↔ (fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}) ∧ fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ

eval (update_evar_val x' e (update_evar_val x c ρ)) ϕ^{evar:S dbi↦x}^{evar:0↦x'} = eval (update_evar_val y' e (update_evar_val y c ρ)) ϕ^{evar:S dbi↦y}^{evar:0↦y'}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , ϕ)
Hfry: evar_is_fresh_in y (ex , ϕ)
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
Hneqfr1: fresh3 ≠ x
Hneqfr2: fresh3 ≠ y
HB: (fresh3 ∉ {[x']}) ∧ fresh3 ∉ {[y']} ∪ (free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ))
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))
i2: fresh3 ∉ {[y']} ∪ (free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ)) ↔ (fresh3 ∉ {[y']}) ∧ fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ)
i3: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ) ↔ (fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}) ∧ fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ

eval (update_evar_val x' e (update_evar_val x c ρ)) ϕ^{evar:S dbi↦x}^{evar:0↦x'} = eval (update_evar_val y' e (update_evar_val y c ρ)) ϕ^{evar:S dbi↦y}^{evar:0↦y'}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , ϕ)
Hfry: evar_is_fresh_in y (ex , ϕ)
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
Hneqfr1: fresh3 ≠ x
Hneqfr2: fresh3 ≠ y
Hneqfr11: fresh3 ∉ {[x']}
HB: fresh3 ∉ {[y']} ∪ (free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ))
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))
i2: fresh3 ∉ {[y']} ∪ (free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ)) ↔ (fresh3 ∉ {[y']}) ∧ fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ)
i3: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ) ↔ (fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}) ∧ fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ

eval (update_evar_val x' e (update_evar_val x c ρ)) ϕ^{evar:S dbi↦x}^{evar:0↦x'} = eval (update_evar_val y' e (update_evar_val y c ρ)) ϕ^{evar:S dbi↦y}^{evar:0↦y'}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , ϕ)
Hfry: evar_is_fresh_in y (ex , ϕ)
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
Hneqfr1: fresh3 ≠ x
Hneqfr2: fresh3 ≠ y
Hneqfr11: fresh3 ≠ x'
HB: fresh3 ∉ {[y']} ∪ (free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ))
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))
i2: fresh3 ∉ {[y']} ∪ (free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ)) ↔ (fresh3 ∉ {[y']}) ∧ fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ)
i3: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ) ↔ (fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}) ∧ fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ

eval (update_evar_val x' e (update_evar_val x c ρ)) ϕ^{evar:S dbi↦x}^{evar:0↦x'} = eval (update_evar_val y' e (update_evar_val y c ρ)) ϕ^{evar:S dbi↦y}^{evar:0↦y'}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , ϕ)
Hfry: evar_is_fresh_in y (ex , ϕ)
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
Hneqfr1: fresh3 ≠ x
Hneqfr2: fresh3 ≠ y
Hneqfr11: fresh3 ≠ x'
HB: (fresh3 ∉ {[y']}) ∧ fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ)
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))
i2: fresh3 ∉ {[y']} ∪ (free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ)) ↔ (fresh3 ∉ {[y']}) ∧ fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ)
i3: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ) ↔ (fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}) ∧ fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ

eval (update_evar_val x' e (update_evar_val x c ρ)) ϕ^{evar:S dbi↦x}^{evar:0↦x'} = eval (update_evar_val y' e (update_evar_val y c ρ)) ϕ^{evar:S dbi↦y}^{evar:0↦y'}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , ϕ)
Hfry: evar_is_fresh_in y (ex , ϕ)
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
Hneqfr1: fresh3 ≠ x
Hneqfr2: fresh3 ≠ y
Hneqfr11: fresh3 ≠ x'
HB: (fresh3 ∉ {[y']}) ∧ fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ)
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))
i3: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ) ↔ (fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}) ∧ fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ

eval (update_evar_val x' e (update_evar_val x c ρ)) ϕ^{evar:S dbi↦x}^{evar:0↦x'} = eval (update_evar_val y' e (update_evar_val y c ρ)) ϕ^{evar:S dbi↦y}^{evar:0↦y'}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , ϕ)
Hfry: evar_is_fresh_in y (ex , ϕ)
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
Hneqfr1: fresh3 ≠ x
Hneqfr2: fresh3 ≠ y
Hneqfr11: fresh3 ≠ x'
Hneqfr22: fresh3 ∉ {[y']}
HB: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ)
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))
i3: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ) ↔ (fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}) ∧ fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ

eval (update_evar_val x' e (update_evar_val x c ρ)) ϕ^{evar:S dbi↦x}^{evar:0↦x'} = eval (update_evar_val y' e (update_evar_val y c ρ)) ϕ^{evar:S dbi↦y}^{evar:0↦y'}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , ϕ)
Hfry: evar_is_fresh_in y (ex , ϕ)
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
Hneqfr1: fresh3 ≠ x
Hneqfr2: fresh3 ≠ y
Hneqfr11: fresh3 ≠ x'
Hneqfr22: fresh3 ≠ y'
HB: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ)
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))
i3: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ) ↔ (fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}) ∧ fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ

eval (update_evar_val x' e (update_evar_val x c ρ)) ϕ^{evar:S dbi↦x}^{evar:0↦x'} = eval (update_evar_val y' e (update_evar_val y c ρ)) ϕ^{evar:S dbi↦y}^{evar:0↦y'}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , ϕ)
Hfry: evar_is_fresh_in y (ex , ϕ)
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
Hneqfr1: fresh3 ≠ x
Hneqfr2: fresh3 ≠ y
Hneqfr11: fresh3 ≠ x'
Hneqfr22: fresh3 ≠ y'
HB: (fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}) ∧ fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))
i3: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x} ∪ (free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ) ↔ (fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}) ∧ fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ

eval (update_evar_val x' e (update_evar_val x c ρ)) ϕ^{evar:S dbi↦x}^{evar:0↦x'} = eval (update_evar_val y' e (update_evar_val y c ρ)) ϕ^{evar:S dbi↦y}^{evar:0↦y'}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , ϕ)
Hfry: evar_is_fresh_in y (ex , ϕ)
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
Hneqfr1: fresh3 ≠ x
Hneqfr2: fresh3 ≠ y
Hneqfr11: fresh3 ≠ x'
Hneqfr22: fresh3 ≠ y'
HB: (fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}) ∧ fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))

eval (update_evar_val x' e (update_evar_val x c ρ)) ϕ^{evar:S dbi↦x}^{evar:0↦x'} = eval (update_evar_val y' e (update_evar_val y c ρ)) ϕ^{evar:S dbi↦y}^{evar:0↦y'}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , ϕ)
Hfry: evar_is_fresh_in y (ex , ϕ)
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
Hneqfr1: fresh3 ≠ x
Hneqfr2: fresh3 ≠ y
Hneqfr11: fresh3 ≠ x'
Hneqfr22: fresh3 ≠ y'
HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}
HB: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y} ∪ free_evars ϕ
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))

eval (update_evar_val x' e (update_evar_val x c ρ)) ϕ^{evar:S dbi↦x}^{evar:0↦x'} = eval (update_evar_val y' e (update_evar_val y c ρ)) ϕ^{evar:S dbi↦y}^{evar:0↦y'}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , ϕ)
Hfry: evar_is_fresh_in y (ex , ϕ)
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
Hneqfr1: fresh3 ≠ x
Hneqfr2: fresh3 ≠ y
Hneqfr11: fresh3 ≠ x'
Hneqfr22: fresh3 ≠ y'
HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}
HB: (fresh3 ∉ free_evars ϕ^{evar:S dbi↦y}) ∧ fresh3 ∉ free_evars ϕ
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))

eval (update_evar_val x' e (update_evar_val x c ρ)) ϕ^{evar:S dbi↦x}^{evar:0↦x'} = eval (update_evar_val y' e (update_evar_val y c ρ)) ϕ^{evar:S dbi↦y}^{evar:0↦y'}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , ϕ)
Hfry: evar_is_fresh_in y (ex , ϕ)
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
Hneqfr1: fresh3 ≠ x
Hneqfr2: fresh3 ≠ y
Hneqfr11: fresh3 ≠ x'
Hneqfr22: fresh3 ≠ y'
HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}
HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y}
HnotinFree: fresh3 ∉ free_evars ϕ
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))

eval (update_evar_val x' e (update_evar_val x c ρ)) ϕ^{evar:S dbi↦x}^{evar:0↦x'} = eval (update_evar_val y' e (update_evar_val y c ρ)) ϕ^{evar:S dbi↦y}^{evar:0↦y'}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , ϕ)
Hfry: evar_is_fresh_in y (ex , ϕ)
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
Hneqfr1: fresh3 ≠ x
Hneqfr2: fresh3 ≠ y
Hneqfr11: fresh3 ≠ x'
Hneqfr22: fresh3 ≠ y'
HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}
HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y}
HnotinFree: fresh3 ∉ free_evars ϕ
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))

size ϕ^{evar:S dbi↦x} ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , ϕ)
Hfry: evar_is_fresh_in y (ex , ϕ)
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
Hneqfr1: fresh3 ≠ x
Hneqfr2: fresh3 ≠ y
Hneqfr11: fresh3 ≠ x'
Hneqfr22: fresh3 ≠ y'
HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}
HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y}
HnotinFree: fresh3 ∉ free_evars ϕ
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))
evar_is_fresh_in x' ϕ^{evar:S dbi↦x}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , ϕ)
Hfry: evar_is_fresh_in y (ex , ϕ)
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
Hneqfr1: fresh3 ≠ x
Hneqfr2: fresh3 ≠ y
Hneqfr11: fresh3 ≠ x'
Hneqfr22: fresh3 ≠ y'
HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}
HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y}
HnotinFree: fresh3 ∉ free_evars ϕ
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))
evar_is_fresh_in fresh3 ϕ^{evar:S dbi↦x}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , ϕ)
Hfry: evar_is_fresh_in y (ex , ϕ)
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
Hneqfr1: fresh3 ≠ x
Hneqfr2: fresh3 ≠ y
Hneqfr11: fresh3 ≠ x'
Hneqfr22: fresh3 ≠ y'
HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}
HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y}
HnotinFree: fresh3 ∉ free_evars ϕ
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))
eval (update_evar_val fresh3 e (update_evar_val x c ρ)) ϕ^{evar:S dbi↦x}^{evar:0↦fresh3} = eval (update_evar_val y' e (update_evar_val y c ρ)) ϕ^{evar:S dbi↦y}^{evar:0↦y'}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , ϕ)
Hfry: evar_is_fresh_in y (ex , ϕ)
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
Hneqfr1: fresh3 ≠ x
Hneqfr2: fresh3 ≠ y
Hneqfr11: fresh3 ≠ x'
Hneqfr22: fresh3 ≠ y'
HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}
HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y}
HnotinFree: fresh3 ∉ free_evars ϕ
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))

size ϕ ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , ϕ)
Hfry: evar_is_fresh_in y (ex , ϕ)
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
Hneqfr1: fresh3 ≠ x
Hneqfr2: fresh3 ≠ y
Hneqfr11: fresh3 ≠ x'
Hneqfr22: fresh3 ≠ y'
HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}
HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y}
HnotinFree: fresh3 ∉ free_evars ϕ
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))
evar_is_fresh_in x' ϕ^{evar:S dbi↦x}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , ϕ)
Hfry: evar_is_fresh_in y (ex , ϕ)
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
Hneqfr1: fresh3 ≠ x
Hneqfr2: fresh3 ≠ y
Hneqfr11: fresh3 ≠ x'
Hneqfr22: fresh3 ≠ y'
HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}
HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y}
HnotinFree: fresh3 ∉ free_evars ϕ
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))
evar_is_fresh_in fresh3 ϕ^{evar:S dbi↦x}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , ϕ)
Hfry: evar_is_fresh_in y (ex , ϕ)
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
Hneqfr1: fresh3 ≠ x
Hneqfr2: fresh3 ≠ y
Hneqfr11: fresh3 ≠ x'
Hneqfr22: fresh3 ≠ y'
HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}
HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y}
HnotinFree: fresh3 ∉ free_evars ϕ
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))
eval (update_evar_val fresh3 e (update_evar_val x c ρ)) ϕ^{evar:S dbi↦x}^{evar:0↦fresh3} = eval (update_evar_val y' e (update_evar_val y c ρ)) ϕ^{evar:S dbi↦y}^{evar:0↦y'}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , ϕ)
Hfry: evar_is_fresh_in y (ex , ϕ)
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
Hneqfr1: fresh3 ≠ x
Hneqfr2: fresh3 ≠ y
Hneqfr11: fresh3 ≠ x'
Hneqfr22: fresh3 ≠ y'
HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}
HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y}
HnotinFree: fresh3 ∉ free_evars ϕ
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))

evar_is_fresh_in x' ϕ^{evar:S dbi↦x}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , ϕ)
Hfry: evar_is_fresh_in y (ex , ϕ)
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
Hneqfr1: fresh3 ≠ x
Hneqfr2: fresh3 ≠ y
Hneqfr11: fresh3 ≠ x'
Hneqfr22: fresh3 ≠ y'
HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}
HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y}
HnotinFree: fresh3 ∉ free_evars ϕ
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))
evar_is_fresh_in fresh3 ϕ^{evar:S dbi↦x}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , ϕ)
Hfry: evar_is_fresh_in y (ex , ϕ)
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
Hneqfr1: fresh3 ≠ x
Hneqfr2: fresh3 ≠ y
Hneqfr11: fresh3 ≠ x'
Hneqfr22: fresh3 ≠ y'
HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}
HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y}
HnotinFree: fresh3 ∉ free_evars ϕ
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))
eval (update_evar_val fresh3 e (update_evar_val x c ρ)) ϕ^{evar:S dbi↦x}^{evar:0↦fresh3} = eval (update_evar_val y' e (update_evar_val y c ρ)) ϕ^{evar:S dbi↦y}^{evar:0↦y'}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , ϕ)
Hfry: evar_is_fresh_in y (ex , ϕ)
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
Hneqfr1: fresh3 ≠ x
Hneqfr2: fresh3 ≠ y
Hneqfr11: fresh3 ≠ x'
Hneqfr22: fresh3 ≠ y'
HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}
HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y}
HnotinFree: fresh3 ∉ free_evars ϕ
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))

evar_is_fresh_in (fresh_evar ϕ^{evar:S dbi↦x}) ϕ^{evar:S dbi↦x}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , ϕ)
Hfry: evar_is_fresh_in y (ex , ϕ)
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
Hneqfr1: fresh3 ≠ x
Hneqfr2: fresh3 ≠ y
Hneqfr11: fresh3 ≠ x'
Hneqfr22: fresh3 ≠ y'
HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}
HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y}
HnotinFree: fresh3 ∉ free_evars ϕ
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))
evar_is_fresh_in fresh3 ϕ^{evar:S dbi↦x}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , ϕ)
Hfry: evar_is_fresh_in y (ex , ϕ)
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
Hneqfr1: fresh3 ≠ x
Hneqfr2: fresh3 ≠ y
Hneqfr11: fresh3 ≠ x'
Hneqfr22: fresh3 ≠ y'
HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}
HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y}
HnotinFree: fresh3 ∉ free_evars ϕ
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))
eval (update_evar_val fresh3 e (update_evar_val x c ρ)) ϕ^{evar:S dbi↦x}^{evar:0↦fresh3} = eval (update_evar_val y' e (update_evar_val y c ρ)) ϕ^{evar:S dbi↦y}^{evar:0↦y'}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , ϕ)
Hfry: evar_is_fresh_in y (ex , ϕ)
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
Hneqfr1: fresh3 ≠ x
Hneqfr2: fresh3 ≠ y
Hneqfr11: fresh3 ≠ x'
Hneqfr22: fresh3 ≠ y'
HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}
HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y}
HnotinFree: fresh3 ∉ free_evars ϕ
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))

evar_is_fresh_in fresh3 ϕ^{evar:S dbi↦x}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , ϕ)
Hfry: evar_is_fresh_in y (ex , ϕ)
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
Hneqfr1: fresh3 ≠ x
Hneqfr2: fresh3 ≠ y
Hneqfr11: fresh3 ≠ x'
Hneqfr22: fresh3 ≠ y'
HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}
HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y}
HnotinFree: fresh3 ∉ free_evars ϕ
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))
eval (update_evar_val fresh3 e (update_evar_val x c ρ)) ϕ^{evar:S dbi↦x}^{evar:0↦fresh3} = eval (update_evar_val y' e (update_evar_val y c ρ)) ϕ^{evar:S dbi↦y}^{evar:0↦y'}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , ϕ)
Hfry: evar_is_fresh_in y (ex , ϕ)
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
Hneqfr1: fresh3 ≠ x
Hneqfr2: fresh3 ≠ y
Hneqfr11: fresh3 ≠ x'
Hneqfr22: fresh3 ≠ y'
HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}
HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y}
HnotinFree: fresh3 ∉ free_evars ϕ
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))

fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , ϕ)
Hfry: evar_is_fresh_in y (ex , ϕ)
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
Hneqfr1: fresh3 ≠ x
Hneqfr2: fresh3 ≠ y
Hneqfr11: fresh3 ≠ x'
Hneqfr22: fresh3 ≠ y'
HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}
HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y}
HnotinFree: fresh3 ∉ free_evars ϕ
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))
eval (update_evar_val fresh3 e (update_evar_val x c ρ)) ϕ^{evar:S dbi↦x}^{evar:0↦fresh3} = eval (update_evar_val y' e (update_evar_val y c ρ)) ϕ^{evar:S dbi↦y}^{evar:0↦y'}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , ϕ)
Hfry: evar_is_fresh_in y (ex , ϕ)
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
Hneqfr1: fresh3 ≠ x
Hneqfr2: fresh3 ≠ y
Hneqfr11: fresh3 ≠ x'
Hneqfr22: fresh3 ≠ y'
HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}
HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y}
HnotinFree: fresh3 ∉ free_evars ϕ
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))

eval (update_evar_val fresh3 e (update_evar_val x c ρ)) ϕ^{evar:S dbi↦x}^{evar:0↦fresh3} = eval (update_evar_val y' e (update_evar_val y c ρ)) ϕ^{evar:S dbi↦y}^{evar:0↦y'}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , ϕ)
Hfry: evar_is_fresh_in y (ex , ϕ)
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
Hneqfr1: fresh3 ≠ x
Hneqfr2: fresh3 ≠ y
Hneqfr11: fresh3 ≠ x'
Hneqfr22: fresh3 ≠ y'
HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}
HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y}
HnotinFree: fresh3 ∉ free_evars ϕ
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))

size ϕ^{evar:S dbi↦y} ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , ϕ)
Hfry: evar_is_fresh_in y (ex , ϕ)
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
Hneqfr1: fresh3 ≠ x
Hneqfr2: fresh3 ≠ y
Hneqfr11: fresh3 ≠ x'
Hneqfr22: fresh3 ≠ y'
HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}
HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y}
HnotinFree: fresh3 ∉ free_evars ϕ
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))
evar_is_fresh_in y' ϕ^{evar:S dbi↦y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , ϕ)
Hfry: evar_is_fresh_in y (ex , ϕ)
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
Hneqfr1: fresh3 ≠ x
Hneqfr2: fresh3 ≠ y
Hneqfr11: fresh3 ≠ x'
Hneqfr22: fresh3 ≠ y'
HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}
HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y}
HnotinFree: fresh3 ∉ free_evars ϕ
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))
evar_is_fresh_in fresh3 ϕ^{evar:S dbi↦y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , ϕ)
Hfry: evar_is_fresh_in y (ex , ϕ)
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
Hneqfr1: fresh3 ≠ x
Hneqfr2: fresh3 ≠ y
Hneqfr11: fresh3 ≠ x'
Hneqfr22: fresh3 ≠ y'
HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}
HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y}
HnotinFree: fresh3 ∉ free_evars ϕ
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))
eval (update_evar_val fresh3 e (update_evar_val x c ρ)) ϕ^{evar:S dbi↦x}^{evar:0↦fresh3} = eval (update_evar_val fresh3 e (update_evar_val y c ρ)) ϕ^{evar:S dbi↦y}^{evar:0↦fresh3}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , ϕ)
Hfry: evar_is_fresh_in y (ex , ϕ)
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
Hneqfr1: fresh3 ≠ x
Hneqfr2: fresh3 ≠ y
Hneqfr11: fresh3 ≠ x'
Hneqfr22: fresh3 ≠ y'
HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}
HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y}
HnotinFree: fresh3 ∉ free_evars ϕ
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))

size ϕ ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , ϕ)
Hfry: evar_is_fresh_in y (ex , ϕ)
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
Hneqfr1: fresh3 ≠ x
Hneqfr2: fresh3 ≠ y
Hneqfr11: fresh3 ≠ x'
Hneqfr22: fresh3 ≠ y'
HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}
HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y}
HnotinFree: fresh3 ∉ free_evars ϕ
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))
evar_is_fresh_in y' ϕ^{evar:S dbi↦y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , ϕ)
Hfry: evar_is_fresh_in y (ex , ϕ)
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
Hneqfr1: fresh3 ≠ x
Hneqfr2: fresh3 ≠ y
Hneqfr11: fresh3 ≠ x'
Hneqfr22: fresh3 ≠ y'
HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}
HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y}
HnotinFree: fresh3 ∉ free_evars ϕ
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))
evar_is_fresh_in fresh3 ϕ^{evar:S dbi↦y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , ϕ)
Hfry: evar_is_fresh_in y (ex , ϕ)
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
Hneqfr1: fresh3 ≠ x
Hneqfr2: fresh3 ≠ y
Hneqfr11: fresh3 ≠ x'
Hneqfr22: fresh3 ≠ y'
HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}
HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y}
HnotinFree: fresh3 ∉ free_evars ϕ
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))
eval (update_evar_val fresh3 e (update_evar_val x c ρ)) ϕ^{evar:S dbi↦x}^{evar:0↦fresh3} = eval (update_evar_val fresh3 e (update_evar_val y c ρ)) ϕ^{evar:S dbi↦y}^{evar:0↦fresh3}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , ϕ)
Hfry: evar_is_fresh_in y (ex , ϕ)
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
Hneqfr1: fresh3 ≠ x
Hneqfr2: fresh3 ≠ y
Hneqfr11: fresh3 ≠ x'
Hneqfr22: fresh3 ≠ y'
HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}
HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y}
HnotinFree: fresh3 ∉ free_evars ϕ
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))

evar_is_fresh_in y' ϕ^{evar:S dbi↦y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , ϕ)
Hfry: evar_is_fresh_in y (ex , ϕ)
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
Hneqfr1: fresh3 ≠ x
Hneqfr2: fresh3 ≠ y
Hneqfr11: fresh3 ≠ x'
Hneqfr22: fresh3 ≠ y'
HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}
HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y}
HnotinFree: fresh3 ∉ free_evars ϕ
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))
evar_is_fresh_in fresh3 ϕ^{evar:S dbi↦y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , ϕ)
Hfry: evar_is_fresh_in y (ex , ϕ)
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
Hneqfr1: fresh3 ≠ x
Hneqfr2: fresh3 ≠ y
Hneqfr11: fresh3 ≠ x'
Hneqfr22: fresh3 ≠ y'
HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}
HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y}
HnotinFree: fresh3 ∉ free_evars ϕ
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))
eval (update_evar_val fresh3 e (update_evar_val x c ρ)) ϕ^{evar:S dbi↦x}^{evar:0↦fresh3} = eval (update_evar_val fresh3 e (update_evar_val y c ρ)) ϕ^{evar:S dbi↦y}^{evar:0↦fresh3}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , ϕ)
Hfry: evar_is_fresh_in y (ex , ϕ)
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
Hneqfr1: fresh3 ≠ x
Hneqfr2: fresh3 ≠ y
Hneqfr11: fresh3 ≠ x'
Hneqfr22: fresh3 ≠ y'
HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}
HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y}
HnotinFree: fresh3 ∉ free_evars ϕ
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))

evar_is_fresh_in (fresh_evar ϕ^{evar:S dbi↦y}) ϕ^{evar:S dbi↦y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , ϕ)
Hfry: evar_is_fresh_in y (ex , ϕ)
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
Hneqfr1: fresh3 ≠ x
Hneqfr2: fresh3 ≠ y
Hneqfr11: fresh3 ≠ x'
Hneqfr22: fresh3 ≠ y'
HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}
HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y}
HnotinFree: fresh3 ∉ free_evars ϕ
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))
evar_is_fresh_in fresh3 ϕ^{evar:S dbi↦y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , ϕ)
Hfry: evar_is_fresh_in y (ex , ϕ)
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
Hneqfr1: fresh3 ≠ x
Hneqfr2: fresh3 ≠ y
Hneqfr11: fresh3 ≠ x'
Hneqfr22: fresh3 ≠ y'
HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}
HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y}
HnotinFree: fresh3 ∉ free_evars ϕ
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))
eval (update_evar_val fresh3 e (update_evar_val x c ρ)) ϕ^{evar:S dbi↦x}^{evar:0↦fresh3} = eval (update_evar_val fresh3 e (update_evar_val y c ρ)) ϕ^{evar:S dbi↦y}^{evar:0↦fresh3}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , ϕ)
Hfry: evar_is_fresh_in y (ex , ϕ)
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
Hneqfr1: fresh3 ≠ x
Hneqfr2: fresh3 ≠ y
Hneqfr11: fresh3 ≠ x'
Hneqfr22: fresh3 ≠ y'
HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}
HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y}
HnotinFree: fresh3 ∉ free_evars ϕ
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))

evar_is_fresh_in fresh3 ϕ^{evar:S dbi↦y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , ϕ)
Hfry: evar_is_fresh_in y (ex , ϕ)
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
Hneqfr1: fresh3 ≠ x
Hneqfr2: fresh3 ≠ y
Hneqfr11: fresh3 ≠ x'
Hneqfr22: fresh3 ≠ y'
HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}
HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y}
HnotinFree: fresh3 ∉ free_evars ϕ
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))
eval (update_evar_val fresh3 e (update_evar_val x c ρ)) ϕ^{evar:S dbi↦x}^{evar:0↦fresh3} = eval (update_evar_val fresh3 e (update_evar_val y c ρ)) ϕ^{evar:S dbi↦y}^{evar:0↦fresh3}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , ϕ)
Hfry: evar_is_fresh_in y (ex , ϕ)
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
Hneqfr1: fresh3 ≠ x
Hneqfr2: fresh3 ≠ y
Hneqfr11: fresh3 ≠ x'
Hneqfr22: fresh3 ≠ y'
HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}
HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y}
HnotinFree: fresh3 ∉ free_evars ϕ
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))

fresh3 ∉ free_evars ϕ^{evar:S dbi↦y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , ϕ)
Hfry: evar_is_fresh_in y (ex , ϕ)
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
Hneqfr1: fresh3 ≠ x
Hneqfr2: fresh3 ≠ y
Hneqfr11: fresh3 ≠ x'
Hneqfr22: fresh3 ≠ y'
HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}
HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y}
HnotinFree: fresh3 ∉ free_evars ϕ
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))
eval (update_evar_val fresh3 e (update_evar_val x c ρ)) ϕ^{evar:S dbi↦x}^{evar:0↦fresh3} = eval (update_evar_val fresh3 e (update_evar_val y c ρ)) ϕ^{evar:S dbi↦y}^{evar:0↦fresh3}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , ϕ)
Hfry: evar_is_fresh_in y (ex , ϕ)
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
Hneqfr1: fresh3 ≠ x
Hneqfr2: fresh3 ≠ y
Hneqfr11: fresh3 ≠ x'
Hneqfr22: fresh3 ≠ y'
HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}
HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y}
HnotinFree: fresh3 ∉ free_evars ϕ
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))

eval (update_evar_val fresh3 e (update_evar_val x c ρ)) ϕ^{evar:S dbi↦x}^{evar:0↦fresh3} = eval (update_evar_val fresh3 e (update_evar_val y c ρ)) ϕ^{evar:S dbi↦y}^{evar:0↦fresh3}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , ϕ)
Hfry: evar_is_fresh_in y (ex , ϕ)
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
Hneqfr1: fresh3 ≠ x
Hneqfr2: fresh3 ≠ y
Hneqfr11: fresh3 ≠ x'
Hneqfr22: fresh3 ≠ y'
HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}
HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y}
HnotinFree: fresh3 ∉ free_evars ϕ
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))

0 < S dbi
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , ϕ)
Hfry: evar_is_fresh_in y (ex , ϕ)
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
Hneqfr1: fresh3 ≠ x
Hneqfr2: fresh3 ≠ y
Hneqfr11: fresh3 ≠ x'
Hneqfr22: fresh3 ≠ y'
HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}
HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y}
HnotinFree: fresh3 ∉ free_evars ϕ
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))
eval (update_evar_val fresh3 e (update_evar_val x c ρ)) ϕ^{evar:0↦fresh3}^{evar: Init.Nat.pred (S dbi)↦x} = eval (update_evar_val fresh3 e (update_evar_val y c ρ)) ϕ^{evar:S dbi↦y}^{evar:0↦fresh3}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , ϕ)
Hfry: evar_is_fresh_in y (ex , ϕ)
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
Hneqfr1: fresh3 ≠ x
Hneqfr2: fresh3 ≠ y
Hneqfr11: fresh3 ≠ x'
Hneqfr22: fresh3 ≠ y'
HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}
HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y}
HnotinFree: fresh3 ∉ free_evars ϕ
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))

eval (update_evar_val fresh3 e (update_evar_val x c ρ)) ϕ^{evar:0↦fresh3}^{evar:Init.Nat.pred (S dbi)↦x} = eval (update_evar_val fresh3 e (update_evar_val y c ρ)) ϕ^{evar:S dbi↦y}^{evar:0↦fresh3}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , ϕ)
Hfry: evar_is_fresh_in y (ex , ϕ)
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
Hneqfr1: fresh3 ≠ x
Hneqfr2: fresh3 ≠ y
Hneqfr11: fresh3 ≠ x'
Hneqfr22: fresh3 ≠ y'
HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}
HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y}
HnotinFree: fresh3 ∉ free_evars ϕ
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))

0 < S dbi
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , ϕ)
Hfry: evar_is_fresh_in y (ex , ϕ)
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
Hneqfr1: fresh3 ≠ x
Hneqfr2: fresh3 ≠ y
Hneqfr11: fresh3 ≠ x'
Hneqfr22: fresh3 ≠ y'
HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}
HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y}
HnotinFree: fresh3 ∉ free_evars ϕ
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))
eval (update_evar_val fresh3 e (update_evar_val x c ρ)) ϕ^{evar:0↦fresh3}^{evar: Init.Nat.pred (S dbi)↦x} = eval (update_evar_val fresh3 e (update_evar_val y c ρ)) ϕ^{evar:0↦fresh3}^{evar: Init.Nat.pred (S dbi)↦y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , ϕ)
Hfry: evar_is_fresh_in y (ex , ϕ)
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
Hneqfr1: fresh3 ≠ x
Hneqfr2: fresh3 ≠ y
Hneqfr11: fresh3 ≠ x'
Hneqfr22: fresh3 ≠ y'
HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}
HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y}
HnotinFree: fresh3 ∉ free_evars ϕ
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))

eval (update_evar_val fresh3 e (update_evar_val x c ρ)) ϕ^{evar:0↦fresh3}^{evar:Init.Nat.pred (S dbi)↦x} = eval (update_evar_val fresh3 e (update_evar_val y c ρ)) ϕ^{evar:0↦fresh3}^{evar:Init.Nat.pred (S dbi)↦y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , ϕ)
Hfry: evar_is_fresh_in y (ex , ϕ)
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
Hneqfr1: fresh3 ≠ x
Hneqfr2: fresh3 ≠ y
Hneqfr11: fresh3 ≠ x'
Hneqfr22: fresh3 ≠ y'
HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}
HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y}
HnotinFree: fresh3 ∉ free_evars ϕ
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))

eval (update_evar_val fresh3 e (update_evar_val x c ρ)) ϕ^{evar:0↦fresh3}^{evar:dbi↦x} = eval (update_evar_val fresh3 e (update_evar_val y c ρ)) ϕ^{evar:0↦fresh3}^{evar:dbi↦y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , ϕ)
Hfry: evar_is_fresh_in y (ex , ϕ)
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
Hneqfr1: fresh3 ≠ x
Hneqfr2: fresh3 ≠ y
Hneqfr11: fresh3 ≠ x'
Hneqfr22: fresh3 ≠ y'
HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}
HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y}
HnotinFree: fresh3 ∉ free_evars ϕ
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))

fresh3 ≠ x
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , ϕ)
Hfry: evar_is_fresh_in y (ex , ϕ)
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
Hneqfr1: fresh3 ≠ x
Hneqfr2: fresh3 ≠ y
Hneqfr11: fresh3 ≠ x'
Hneqfr22: fresh3 ≠ y'
HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}
HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y}
HnotinFree: fresh3 ∉ free_evars ϕ
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))
eval (update_evar_val x c (update_evar_val fresh3 e ρ)) ϕ^{evar:0↦fresh3}^{evar:dbi↦x} = eval (update_evar_val fresh3 e (update_evar_val y c ρ)) ϕ^{evar:0↦fresh3}^{evar:dbi↦y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , ϕ)
Hfry: evar_is_fresh_in y (ex , ϕ)
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
Hneqfr1: fresh3 ≠ x
Hneqfr2: fresh3 ≠ y
Hneqfr11: fresh3 ≠ x'
Hneqfr22: fresh3 ≠ y'
HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}
HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y}
HnotinFree: fresh3 ∉ free_evars ϕ
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))

eval (update_evar_val x c (update_evar_val fresh3 e ρ)) ϕ^{evar:0↦fresh3}^{evar:dbi↦x} = eval (update_evar_val fresh3 e (update_evar_val y c ρ)) ϕ^{evar:0↦fresh3}^{evar:dbi↦y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , ϕ)
Hfry: evar_is_fresh_in y (ex , ϕ)
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
Hneqfr1: fresh3 ≠ x
Hneqfr2: fresh3 ≠ y
Hneqfr11: fresh3 ≠ x'
Hneqfr22: fresh3 ≠ y'
HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}
HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y}
HnotinFree: fresh3 ∉ free_evars ϕ
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))

fresh3 ≠ y
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , ϕ)
Hfry: evar_is_fresh_in y (ex , ϕ)
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
Hneqfr1: fresh3 ≠ x
Hneqfr2: fresh3 ≠ y
Hneqfr11: fresh3 ≠ x'
Hneqfr22: fresh3 ≠ y'
HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}
HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y}
HnotinFree: fresh3 ∉ free_evars ϕ
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))
eval (update_evar_val x c (update_evar_val fresh3 e ρ)) ϕ^{evar:0↦fresh3}^{evar:dbi↦x} = eval (update_evar_val y c (update_evar_val fresh3 e ρ)) ϕ^{evar:0↦fresh3}^{evar:dbi↦y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , ϕ)
Hfry: evar_is_fresh_in y (ex , ϕ)
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
Hneqfr1: fresh3 ≠ x
Hneqfr2: fresh3 ≠ y
Hneqfr11: fresh3 ≠ x'
Hneqfr22: fresh3 ≠ y'
HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}
HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y}
HnotinFree: fresh3 ∉ free_evars ϕ
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))

eval (update_evar_val x c (update_evar_val fresh3 e ρ)) ϕ^{evar:0↦fresh3}^{evar:dbi↦x} = eval (update_evar_val y c (update_evar_val fresh3 e ρ)) ϕ^{evar:0↦fresh3}^{evar:dbi↦y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , (ex , ϕ))
Hfry: evar_is_fresh_in y (ex , ϕ)
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
Hneqfr1: fresh3 ≠ x
Hneqfr2: fresh3 ≠ y
Hneqfr11: fresh3 ≠ x'
Hneqfr22: fresh3 ≠ y'
HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}
HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y}
HnotinFree: fresh3 ∉ free_evars ϕ
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))

eval (update_evar_val x c (update_evar_val fresh3 e ρ)) ϕ^{evar:0↦fresh3}^{evar:dbi↦x} = eval (update_evar_val y c (update_evar_val fresh3 e ρ)) ϕ^{evar:0↦fresh3}^{evar:dbi↦y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , (ex , ϕ))
Hfry: evar_is_fresh_in y (ex , (ex , ϕ))
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
Hneqfr1: fresh3 ≠ x
Hneqfr2: fresh3 ≠ y
Hneqfr11: fresh3 ≠ x'
Hneqfr22: fresh3 ≠ y'
HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}
HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y}
HnotinFree: fresh3 ∉ free_evars ϕ
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))

eval (update_evar_val x c (update_evar_val fresh3 e ρ)) ϕ^{evar:0↦fresh3}^{evar:dbi↦x} = eval (update_evar_val y c (update_evar_val fresh3 e ρ)) ϕ^{evar:0↦fresh3}^{evar:dbi↦y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , (ex , ϕ))
Hfry: evar_is_fresh_in y (ex , (ex , ϕ))
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
Hneqfr1: fresh3 ≠ x
Hneqfr2: fresh3 ≠ y
Hneqfr11: fresh3 ≠ x'
Hneqfr22: fresh3 ≠ y'
HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}
HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y}
HnotinFree: fresh3 ∉ free_evars ϕ
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))

size ϕ^{evar:0↦fresh3} ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , (ex , ϕ))
Hfry: evar_is_fresh_in y (ex , (ex , ϕ))
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
Hneqfr1: fresh3 ≠ x
Hneqfr2: fresh3 ≠ y
Hneqfr11: fresh3 ≠ x'
Hneqfr22: fresh3 ≠ y'
HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}
HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y}
HnotinFree: fresh3 ∉ free_evars ϕ
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))
evar_is_fresh_in x ϕ^{evar:0↦fresh3}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , (ex , ϕ))
Hfry: evar_is_fresh_in y (ex , (ex , ϕ))
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
Hneqfr1: fresh3 ≠ x
Hneqfr2: fresh3 ≠ y
Hneqfr11: fresh3 ≠ x'
Hneqfr22: fresh3 ≠ y'
HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}
HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y}
HnotinFree: fresh3 ∉ free_evars ϕ
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))
evar_is_fresh_in y ϕ^{evar:0↦fresh3}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , (ex , ϕ))
Hfry: evar_is_fresh_in y (ex , (ex , ϕ))
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
Hneqfr1: fresh3 ≠ x
Hneqfr2: fresh3 ≠ y
Hneqfr11: fresh3 ≠ x'
Hneqfr22: fresh3 ≠ y'
HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}
HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y}
HnotinFree: fresh3 ∉ free_evars ϕ
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))
eval (update_evar_val y c (update_evar_val fresh3 e ρ)) ϕ^{evar:0↦fresh3}^{evar:dbi↦y} = eval (update_evar_val y c (update_evar_val fresh3 e ρ)) ϕ^{evar:0↦fresh3}^{evar:dbi↦y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , (ex , ϕ))
Hfry: evar_is_fresh_in y (ex , (ex , ϕ))
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
Hneqfr1: fresh3 ≠ x
Hneqfr2: fresh3 ≠ y
Hneqfr11: fresh3 ≠ x'
Hneqfr22: fresh3 ≠ y'
HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}
HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y}
HnotinFree: fresh3 ∉ free_evars ϕ
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))

size ϕ ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , (ex , ϕ))
Hfry: evar_is_fresh_in y (ex , (ex , ϕ))
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
Hneqfr1: fresh3 ≠ x
Hneqfr2: fresh3 ≠ y
Hneqfr11: fresh3 ≠ x'
Hneqfr22: fresh3 ≠ y'
HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}
HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y}
HnotinFree: fresh3 ∉ free_evars ϕ
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))
evar_is_fresh_in x ϕ^{evar:0↦fresh3}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , (ex , ϕ))
Hfry: evar_is_fresh_in y (ex , (ex , ϕ))
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
Hneqfr1: fresh3 ≠ x
Hneqfr2: fresh3 ≠ y
Hneqfr11: fresh3 ≠ x'
Hneqfr22: fresh3 ≠ y'
HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}
HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y}
HnotinFree: fresh3 ∉ free_evars ϕ
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))
evar_is_fresh_in y ϕ^{evar:0↦fresh3}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , (ex , ϕ))
Hfry: evar_is_fresh_in y (ex , (ex , ϕ))
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
Hneqfr1: fresh3 ≠ x
Hneqfr2: fresh3 ≠ y
Hneqfr11: fresh3 ≠ x'
Hneqfr22: fresh3 ≠ y'
HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}
HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y}
HnotinFree: fresh3 ∉ free_evars ϕ
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))
eval (update_evar_val y c (update_evar_val fresh3 e ρ)) ϕ^{evar:0↦fresh3}^{evar:dbi↦y} = eval (update_evar_val y c (update_evar_val fresh3 e ρ)) ϕ^{evar:0↦fresh3}^{evar:dbi↦y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , (ex , ϕ))
Hfry: evar_is_fresh_in y (ex , (ex , ϕ))
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
Hneqfr1: fresh3 ≠ x
Hneqfr2: fresh3 ≠ y
Hneqfr11: fresh3 ≠ x'
Hneqfr22: fresh3 ≠ y'
HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}
HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y}
HnotinFree: fresh3 ∉ free_evars ϕ
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))

evar_is_fresh_in x ϕ^{evar:0↦fresh3}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , (ex , ϕ))
Hfry: evar_is_fresh_in y (ex , (ex , ϕ))
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
Hneqfr1: fresh3 ≠ x
Hneqfr2: fresh3 ≠ y
Hneqfr11: fresh3 ≠ x'
Hneqfr22: fresh3 ≠ y'
HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}
HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y}
HnotinFree: fresh3 ∉ free_evars ϕ
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))
evar_is_fresh_in y ϕ^{evar:0↦fresh3}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , (ex , ϕ))
Hfry: evar_is_fresh_in y (ex , (ex , ϕ))
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
Hneqfr1: fresh3 ≠ x
Hneqfr2: fresh3 ≠ y
Hneqfr11: fresh3 ≠ x'
Hneqfr22: fresh3 ≠ y'
HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}
HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y}
HnotinFree: fresh3 ∉ free_evars ϕ
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))
eval (update_evar_val y c (update_evar_val fresh3 e ρ)) ϕ^{evar:0↦fresh3}^{evar:dbi↦y} = eval (update_evar_val y c (update_evar_val fresh3 e ρ)) ϕ^{evar:0↦fresh3}^{evar:dbi↦y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , (ex , ϕ))
Hfry: evar_is_fresh_in y (ex , (ex , ϕ))
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
Hneqfr1: fresh3 ≠ x
Hneqfr2: fresh3 ≠ y
Hneqfr11: fresh3 ≠ x'
Hneqfr22: fresh3 ≠ y'
HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}
HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y}
HnotinFree: fresh3 ∉ free_evars ϕ
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))

x ∉ free_evars ϕ^{evar:0↦fresh3}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , (ex , ϕ))
Hfry: evar_is_fresh_in y (ex , (ex , ϕ))
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
Hneqfr1: fresh3 ≠ x
Hneqfr2: fresh3 ≠ y
Hneqfr11: fresh3 ≠ x'
Hneqfr22: fresh3 ≠ y'
HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}
HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y}
HnotinFree: fresh3 ∉ free_evars ϕ
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))
evar_is_fresh_in y ϕ^{evar:0↦fresh3}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , (ex , ϕ))
Hfry: evar_is_fresh_in y (ex , (ex , ϕ))
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
Hneqfr1: fresh3 ≠ x
Hneqfr2: fresh3 ≠ y
Hneqfr11: fresh3 ≠ x'
Hneqfr22: fresh3 ≠ y'
HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}
HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y}
HnotinFree: fresh3 ∉ free_evars ϕ
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))
eval (update_evar_val y c (update_evar_val fresh3 e ρ)) ϕ^{evar:0↦fresh3}^{evar:dbi↦y} = eval (update_evar_val y c (update_evar_val fresh3 e ρ)) ϕ^{evar:0↦fresh3}^{evar:dbi↦y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , (ex , ϕ))
Hfry: evar_is_fresh_in y (ex , (ex , ϕ))
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
Hneqfr1: fresh3 ≠ x
Hneqfr2: fresh3 ≠ y
Hneqfr11: fresh3 ≠ x'
Hneqfr22: fresh3 ≠ y'
HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}
HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y}
HnotinFree: fresh3 ∉ free_evars ϕ
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))

x ∉ free_evars ϕ
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , (ex , ϕ))
Hfry: evar_is_fresh_in y (ex , (ex , ϕ))
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
Hneqfr1: fresh3 ≠ x
Hneqfr2: fresh3 ≠ y
Hneqfr11: fresh3 ≠ x'
Hneqfr22: fresh3 ≠ y'
HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}
HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y}
HnotinFree: fresh3 ∉ free_evars ϕ
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))
fresh3 ∉ free_evars ϕ
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , (ex , ϕ))
Hfry: evar_is_fresh_in y (ex , (ex , ϕ))
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
Hneqfr1: fresh3 ≠ x
Hneqfr2: fresh3 ≠ y
Hneqfr11: fresh3 ≠ x'
Hneqfr22: fresh3 ≠ y'
HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}
HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y}
HnotinFree: fresh3 ∉ free_evars ϕ
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))
x ≠ fresh3
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , (ex , ϕ))
Hfry: evar_is_fresh_in y (ex , (ex , ϕ))
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
Hneqfr1: fresh3 ≠ x
Hneqfr2: fresh3 ≠ y
Hneqfr11: fresh3 ≠ x'
Hneqfr22: fresh3 ≠ y'
HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}
HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y}
HnotinFree: fresh3 ∉ free_evars ϕ
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))
evar_is_fresh_in y ϕ^{evar:0↦fresh3}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , (ex , ϕ))
Hfry: evar_is_fresh_in y (ex , (ex , ϕ))
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
Hneqfr1: fresh3 ≠ x
Hneqfr2: fresh3 ≠ y
Hneqfr11: fresh3 ≠ x'
Hneqfr22: fresh3 ≠ y'
HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}
HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y}
HnotinFree: fresh3 ∉ free_evars ϕ
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))
eval (update_evar_val y c (update_evar_val fresh3 e ρ)) ϕ^{evar:0↦fresh3}^{evar:dbi↦y} = eval (update_evar_val y c (update_evar_val fresh3 e ρ)) ϕ^{evar:0↦fresh3}^{evar:dbi↦y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , (ex , ϕ))
Hfry: evar_is_fresh_in y (ex , (ex , ϕ))
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
Hneqfr1: fresh3 ≠ x
Hneqfr2: fresh3 ≠ y
Hneqfr11: fresh3 ≠ x'
Hneqfr22: fresh3 ≠ y'
HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}
HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y}
HnotinFree: fresh3 ∉ free_evars ϕ
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))

fresh3 ∉ free_evars ϕ
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , (ex , ϕ))
Hfry: evar_is_fresh_in y (ex , (ex , ϕ))
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
Hneqfr1: fresh3 ≠ x
Hneqfr2: fresh3 ≠ y
Hneqfr11: fresh3 ≠ x'
Hneqfr22: fresh3 ≠ y'
HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}
HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y}
HnotinFree: fresh3 ∉ free_evars ϕ
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))
x ≠ fresh3
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , (ex , ϕ))
Hfry: evar_is_fresh_in y (ex , (ex , ϕ))
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
Hneqfr1: fresh3 ≠ x
Hneqfr2: fresh3 ≠ y
Hneqfr11: fresh3 ≠ x'
Hneqfr22: fresh3 ≠ y'
HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}
HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y}
HnotinFree: fresh3 ∉ free_evars ϕ
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))
evar_is_fresh_in y ϕ^{evar:0↦fresh3}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , (ex , ϕ))
Hfry: evar_is_fresh_in y (ex , (ex , ϕ))
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
Hneqfr1: fresh3 ≠ x
Hneqfr2: fresh3 ≠ y
Hneqfr11: fresh3 ≠ x'
Hneqfr22: fresh3 ≠ y'
HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}
HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y}
HnotinFree: fresh3 ∉ free_evars ϕ
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))
eval (update_evar_val y c (update_evar_val fresh3 e ρ)) ϕ^{evar:0↦fresh3}^{evar:dbi↦y} = eval (update_evar_val y c (update_evar_val fresh3 e ρ)) ϕ^{evar:0↦fresh3}^{evar:dbi↦y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , (ex , ϕ))
Hfry: evar_is_fresh_in y (ex , (ex , ϕ))
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
Hneqfr1: fresh3 ≠ x
Hneqfr2: fresh3 ≠ y
Hneqfr11: fresh3 ≠ x'
Hneqfr22: fresh3 ≠ y'
HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}
HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y}
HnotinFree: fresh3 ∉ free_evars ϕ
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))

x ≠ fresh3
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , (ex , ϕ))
Hfry: evar_is_fresh_in y (ex , (ex , ϕ))
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
Hneqfr1: fresh3 ≠ x
Hneqfr2: fresh3 ≠ y
Hneqfr11: fresh3 ≠ x'
Hneqfr22: fresh3 ≠ y'
HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}
HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y}
HnotinFree: fresh3 ∉ free_evars ϕ
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))
evar_is_fresh_in y ϕ^{evar:0↦fresh3}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , (ex , ϕ))
Hfry: evar_is_fresh_in y (ex , (ex , ϕ))
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
Hneqfr1: fresh3 ≠ x
Hneqfr2: fresh3 ≠ y
Hneqfr11: fresh3 ≠ x'
Hneqfr22: fresh3 ≠ y'
HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}
HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y}
HnotinFree: fresh3 ∉ free_evars ϕ
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))
eval (update_evar_val y c (update_evar_val fresh3 e ρ)) ϕ^{evar:0↦fresh3}^{evar:dbi↦y} = eval (update_evar_val y c (update_evar_val fresh3 e ρ)) ϕ^{evar:0↦fresh3}^{evar:dbi↦y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , (ex , ϕ))
Hfry: evar_is_fresh_in y (ex , (ex , ϕ))
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
Hneqfr1: fresh3 ≠ x
Hneqfr2: fresh3 ≠ y
Hneqfr11: fresh3 ≠ x'
Hneqfr22: fresh3 ≠ y'
HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}
HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y}
HnotinFree: fresh3 ∉ free_evars ϕ
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))
Contra: x = fresh3

False
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , (ex , ϕ))
Hfry: evar_is_fresh_in y (ex , (ex , ϕ))
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
Hneqfr1: fresh3 ≠ x
Hneqfr2: fresh3 ≠ y
Hneqfr11: fresh3 ≠ x'
Hneqfr22: fresh3 ≠ y'
HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}
HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y}
HnotinFree: fresh3 ∉ free_evars ϕ
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))
evar_is_fresh_in y ϕ^{evar:0↦fresh3}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , (ex , ϕ))
Hfry: evar_is_fresh_in y (ex , (ex , ϕ))
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
Hneqfr1: fresh3 ≠ x
Hneqfr2: fresh3 ≠ y
Hneqfr11: fresh3 ≠ x'
Hneqfr22: fresh3 ≠ y'
HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}
HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y}
HnotinFree: fresh3 ∉ free_evars ϕ
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))
eval (update_evar_val y c (update_evar_val fresh3 e ρ)) ϕ^{evar:0↦fresh3}^{evar:dbi↦y} = eval (update_evar_val y c (update_evar_val fresh3 e ρ)) ϕ^{evar:0↦fresh3}^{evar:dbi↦y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , (ex , ϕ))
Hfry: evar_is_fresh_in y (ex , (ex , ϕ))
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
Hneqfr1: fresh3 ≠ x
Hneqfr2: fresh3 ≠ y
Hneqfr11: fresh3 ≠ x'
Hneqfr22: fresh3 ≠ y'
HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}
HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y}
HnotinFree: fresh3 ∉ free_evars ϕ
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))
Contra: fresh3 = x

False
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , (ex , ϕ))
Hfry: evar_is_fresh_in y (ex , (ex , ϕ))
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
Hneqfr1: fresh3 ≠ x
Hneqfr2: fresh3 ≠ y
Hneqfr11: fresh3 ≠ x'
Hneqfr22: fresh3 ≠ y'
HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}
HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y}
HnotinFree: fresh3 ∉ free_evars ϕ
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))
evar_is_fresh_in y ϕ^{evar:0↦fresh3}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , (ex , ϕ))
Hfry: evar_is_fresh_in y (ex , (ex , ϕ))
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
Hneqfr1: fresh3 ≠ x
Hneqfr2: fresh3 ≠ y
Hneqfr11: fresh3 ≠ x'
Hneqfr22: fresh3 ≠ y'
HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}
HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y}
HnotinFree: fresh3 ∉ free_evars ϕ
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))
eval (update_evar_val y c (update_evar_val fresh3 e ρ)) ϕ^{evar:0↦fresh3}^{evar:dbi↦y} = eval (update_evar_val y c (update_evar_val fresh3 e ρ)) ϕ^{evar:0↦fresh3}^{evar:dbi↦y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , (ex , ϕ))
Hfry: evar_is_fresh_in y (ex , (ex , ϕ))
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
Hneqfr1: fresh3 ≠ x
Hneqfr2: fresh3 ≠ y
Hneqfr11: fresh3 ≠ x'
Hneqfr22: fresh3 ≠ y'
HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}
HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y}
HnotinFree: fresh3 ∉ free_evars ϕ
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))

evar_is_fresh_in y ϕ^{evar:0↦fresh3}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , (ex , ϕ))
Hfry: evar_is_fresh_in y (ex , (ex , ϕ))
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
Hneqfr1: fresh3 ≠ x
Hneqfr2: fresh3 ≠ y
Hneqfr11: fresh3 ≠ x'
Hneqfr22: fresh3 ≠ y'
HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}
HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y}
HnotinFree: fresh3 ∉ free_evars ϕ
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))
eval (update_evar_val y c (update_evar_val fresh3 e ρ)) ϕ^{evar:0↦fresh3}^{evar:dbi↦y} = eval (update_evar_val y c (update_evar_val fresh3 e ρ)) ϕ^{evar:0↦fresh3}^{evar:dbi↦y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , (ex , ϕ))
Hfry: evar_is_fresh_in y (ex , (ex , ϕ))
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
Hneqfr1: fresh3 ≠ x
Hneqfr2: fresh3 ≠ y
Hneqfr11: fresh3 ≠ x'
Hneqfr22: fresh3 ≠ y'
HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}
HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y}
HnotinFree: fresh3 ∉ free_evars ϕ
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))

y ∉ free_evars ϕ
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , (ex , ϕ))
Hfry: evar_is_fresh_in y (ex , (ex , ϕ))
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
Hneqfr1: fresh3 ≠ x
Hneqfr2: fresh3 ≠ y
Hneqfr11: fresh3 ≠ x'
Hneqfr22: fresh3 ≠ y'
HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}
HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y}
HnotinFree: fresh3 ∉ free_evars ϕ
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))
fresh3 ∉ free_evars ϕ
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , (ex , ϕ))
Hfry: evar_is_fresh_in y (ex , (ex , ϕ))
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
Hneqfr1: fresh3 ≠ x
Hneqfr2: fresh3 ≠ y
Hneqfr11: fresh3 ≠ x'
Hneqfr22: fresh3 ≠ y'
HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}
HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y}
HnotinFree: fresh3 ∉ free_evars ϕ
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))
y ≠ fresh3
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , (ex , ϕ))
Hfry: evar_is_fresh_in y (ex , (ex , ϕ))
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
Hneqfr1: fresh3 ≠ x
Hneqfr2: fresh3 ≠ y
Hneqfr11: fresh3 ≠ x'
Hneqfr22: fresh3 ≠ y'
HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}
HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y}
HnotinFree: fresh3 ∉ free_evars ϕ
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))
eval (update_evar_val y c (update_evar_val fresh3 e ρ)) ϕ^{evar:0↦fresh3}^{evar:dbi↦y} = eval (update_evar_val y c (update_evar_val fresh3 e ρ)) ϕ^{evar:0↦fresh3}^{evar:dbi↦y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , (ex , ϕ))
Hfry: evar_is_fresh_in y (ex , (ex , ϕ))
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
Hneqfr1: fresh3 ≠ x
Hneqfr2: fresh3 ≠ y
Hneqfr11: fresh3 ≠ x'
Hneqfr22: fresh3 ≠ y'
HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}
HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y}
HnotinFree: fresh3 ∉ free_evars ϕ
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))

fresh3 ∉ free_evars ϕ
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , (ex , ϕ))
Hfry: evar_is_fresh_in y (ex , (ex , ϕ))
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
Hneqfr1: fresh3 ≠ x
Hneqfr2: fresh3 ≠ y
Hneqfr11: fresh3 ≠ x'
Hneqfr22: fresh3 ≠ y'
HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}
HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y}
HnotinFree: fresh3 ∉ free_evars ϕ
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))
y ≠ fresh3
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , (ex , ϕ))
Hfry: evar_is_fresh_in y (ex , (ex , ϕ))
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
Hneqfr1: fresh3 ≠ x
Hneqfr2: fresh3 ≠ y
Hneqfr11: fresh3 ≠ x'
Hneqfr22: fresh3 ≠ y'
HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}
HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y}
HnotinFree: fresh3 ∉ free_evars ϕ
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))
eval (update_evar_val y c (update_evar_val fresh3 e ρ)) ϕ^{evar:0↦fresh3}^{evar:dbi↦y} = eval (update_evar_val y c (update_evar_val fresh3 e ρ)) ϕ^{evar:0↦fresh3}^{evar:dbi↦y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , (ex , ϕ))
Hfry: evar_is_fresh_in y (ex , (ex , ϕ))
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
Hneqfr1: fresh3 ≠ x
Hneqfr2: fresh3 ≠ y
Hneqfr11: fresh3 ≠ x'
Hneqfr22: fresh3 ≠ y'
HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}
HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y}
HnotinFree: fresh3 ∉ free_evars ϕ
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))

y ≠ fresh3
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , (ex , ϕ))
Hfry: evar_is_fresh_in y (ex , (ex , ϕ))
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
Hneqfr1: fresh3 ≠ x
Hneqfr2: fresh3 ≠ y
Hneqfr11: fresh3 ≠ x'
Hneqfr22: fresh3 ≠ y'
HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}
HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y}
HnotinFree: fresh3 ∉ free_evars ϕ
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))
eval (update_evar_val y c (update_evar_val fresh3 e ρ)) ϕ^{evar:0↦fresh3}^{evar:dbi↦y} = eval (update_evar_val y c (update_evar_val fresh3 e ρ)) ϕ^{evar:0↦fresh3}^{evar:dbi↦y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , (ex , ϕ))
Hfry: evar_is_fresh_in y (ex , (ex , ϕ))
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
Hneqfr1: fresh3 ≠ x
Hneqfr2: fresh3 ≠ y
Hneqfr11: fresh3 ≠ x'
Hneqfr22: fresh3 ≠ y'
HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}
HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y}
HnotinFree: fresh3 ∉ free_evars ϕ
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))
Contra: y = fresh3

False
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , (ex , ϕ))
Hfry: evar_is_fresh_in y (ex , (ex , ϕ))
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
Hneqfr1: fresh3 ≠ x
Hneqfr2: fresh3 ≠ y
Hneqfr11: fresh3 ≠ x'
Hneqfr22: fresh3 ≠ y'
HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}
HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y}
HnotinFree: fresh3 ∉ free_evars ϕ
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))
eval (update_evar_val y c (update_evar_val fresh3 e ρ)) ϕ^{evar:0↦fresh3}^{evar:dbi↦y} = eval (update_evar_val y c (update_evar_val fresh3 e ρ)) ϕ^{evar:0↦fresh3}^{evar:dbi↦y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , (ex , ϕ))
Hfry: evar_is_fresh_in y (ex , (ex , ϕ))
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
Hneqfr1: fresh3 ≠ x
Hneqfr2: fresh3 ≠ y
Hneqfr11: fresh3 ≠ x'
Hneqfr22: fresh3 ≠ y'
HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}
HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y}
HnotinFree: fresh3 ∉ free_evars ϕ
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))
Contra: fresh3 = y

False
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , (ex , ϕ))
Hfry: evar_is_fresh_in y (ex , (ex , ϕ))
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
Hneqfr1: fresh3 ≠ x
Hneqfr2: fresh3 ≠ y
Hneqfr11: fresh3 ≠ x'
Hneqfr22: fresh3 ≠ y'
HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}
HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y}
HnotinFree: fresh3 ∉ free_evars ϕ
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))
eval (update_evar_val y c (update_evar_val fresh3 e ρ)) ϕ^{evar:0↦fresh3}^{evar:dbi↦y} = eval (update_evar_val y c (update_evar_val fresh3 e ρ)) ϕ^{evar:0↦fresh3}^{evar:dbi↦y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (ex , (ex , ϕ))
Hfry: evar_is_fresh_in y (ex , (ex , ϕ))
e: M
x': evar
Heqx': x' = fresh_evar ϕ^{evar:S dbi↦x}
y': evar
Heqy': y' = fresh_evar ϕ^{evar:S dbi↦y}
fresh3: evar
Hneqfr1: fresh3 ≠ x
Hneqfr2: fresh3 ≠ y
Hneqfr11: fresh3 ≠ x'
Hneqfr22: fresh3 ≠ y'
HnotinFree1: fresh3 ∉ free_evars ϕ^{evar:S dbi↦x}
HnotinFree2: fresh3 ∉ free_evars ϕ^{evar:S dbi↦y}
HnotinFree: fresh3 ∉ free_evars ϕ
Heqfresh3: fresh3 = evar_fresh (elements ({[x]} ∪ ({[y]} ∪ ({[x']} ∪ ({[y']} ∪ (free_evars ϕ^{evar: S dbi↦x} ∪ (free_evars ϕ^{evar: S dbi↦y} ∪ free_evars ϕ)))))))

eval (update_evar_val y c (update_evar_val fresh3 e ρ)) ϕ^{evar:0↦fresh3}^{evar:dbi↦y} = eval (update_evar_val y c (update_evar_val fresh3 e ρ)) ϕ^{evar:0↦fresh3}^{evar:dbi↦y}
reflexivity.
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (mu , ϕ)
Hfry: evar_is_fresh_in y (mu , ϕ)

eval (update_evar_val x c ρ) (mu , ϕ)^{evar:dbi↦x} = eval (update_evar_val y c ρ) (mu , ϕ)^{evar:dbi↦y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (mu , ϕ)
Hfry: evar_is_fresh_in y (mu , ϕ)

(let X := fresh_svar ((fix bevar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_evar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_evar (Nat.pred n) end | patt_bound_svar n => patt_bound_svar n | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bevar_subst psi x phi1 $ bevar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bevar_subst psi x phi1 ---> bevar_subst psi x phi2 | ex , phi' => ex , bevar_subst psi (S x) phi' | mu , phi' => mu , bevar_subst psi x phi' end) (patt_free_evar x) dbi ϕ) in LeastFixpointOf (λ S0 : propset M, let ρ' := update_svar_val X S0 (update_evar_val x c ρ) in eval ρ' ((fix bevar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_evar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_evar (Nat.pred n) end | patt_bound_svar n => patt_bound_svar n | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bevar_subst psi x phi1 $ bevar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bevar_subst psi x phi1 ---> bevar_subst psi x phi2 | ex , phi' => ex , bevar_subst psi (S x) phi' | mu , phi' => mu , bevar_subst psi x phi' end) (patt_free_evar x) dbi ϕ)^{svar:0↦X})) = (let X := fresh_svar ((fix bevar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_evar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_evar (Nat.pred n) end | patt_bound_svar n => patt_bound_svar n | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bevar_subst psi x phi1 $ bevar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bevar_subst psi x phi1 ---> bevar_subst psi x phi2 | ex , phi' => ex , bevar_subst psi (S x) phi' | mu , phi' => mu , bevar_subst psi x phi' end) (patt_free_evar y) dbi ϕ) in LeastFixpointOf (λ S0 : propset M, let ρ' := update_svar_val X S0 (update_evar_val y c ρ) in eval ρ' ((fix bevar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_evar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_evar (Nat.pred n) end | patt_bound_svar n => patt_bound_svar n | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bevar_subst psi x phi1 $ bevar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bevar_subst psi x phi1 ---> bevar_subst psi x phi2 | ex , phi' => ex , bevar_subst psi (S x) phi' | mu , phi' => mu , bevar_subst psi x phi' end) (patt_free_evar y) dbi ϕ)^{svar:0↦X}))
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (mu , ϕ)
Hfry: evar_is_fresh_in y (mu , ϕ)

(let X := fresh_svar ((fix bevar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_evar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_evar (Nat.pred n) end | patt_bound_svar n => patt_bound_svar n | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bevar_subst psi x phi1 $ bevar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bevar_subst psi x phi1 ---> bevar_subst psi x phi2 | ex , phi' => ex , bevar_subst psi (S x) phi' | mu , phi' => mu , bevar_subst psi x phi' end) (patt_free_evar x) dbi ϕ) in LeastFixpointOf (λ S0 : propset M, let ρ' := update_svar_val X S0 (update_evar_val x c ρ) in eval ρ' ((fix bevar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_evar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_evar (Nat.pred n) end | patt_bound_svar n => patt_bound_svar n | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bevar_subst psi x phi1 $ bevar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bevar_subst psi x phi1 ---> bevar_subst psi x phi2 | ex , phi' => ex , bevar_subst psi (S x) phi' | mu , phi' => mu , bevar_subst psi x phi' end) (patt_free_evar x) dbi ϕ)^{svar:0↦X})) = (let X := fresh_svar ((fix bevar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_evar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_evar (Nat.pred n) end | patt_bound_svar n => patt_bound_svar n | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bevar_subst psi x phi1 $ bevar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bevar_subst psi x phi1 ---> bevar_subst psi x phi2 | ex , phi' => ex , bevar_subst psi (S x) phi' | mu , phi' => mu , bevar_subst psi x phi' end) (patt_free_evar y) dbi ϕ) in LeastFixpointOf (λ S0 : propset M, let ρ' := update_svar_val X S0 (update_evar_val y c ρ) in eval ρ' ((fix bevar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_evar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_evar (Nat.pred n) end | patt_bound_svar n => patt_bound_svar n | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bevar_subst psi x phi1 $ bevar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bevar_subst psi x phi1 ---> bevar_subst psi x phi2 | ex , phi' => ex , bevar_subst psi (S x) phi' | mu , phi' => mu , bevar_subst psi x phi' end) (patt_free_evar y) dbi ϕ)^{svar:0↦X}))
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (mu , ϕ)
Hfry: evar_is_fresh_in y (mu , ϕ)

LeastFixpointOf (λ S0 : propset M, eval (update_svar_val (fresh_svar ((fix bevar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_evar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_evar (Nat.pred n) end | patt_bound_svar n => patt_bound_svar n | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bevar_subst psi x phi1 $ bevar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bevar_subst psi x phi1 ---> bevar_subst psi x phi2 | ex , phi' => ex , bevar_subst psi (S x) phi' | mu , phi' => mu , bevar_subst psi x phi' end) (patt_free_evar x) dbi ϕ)) S0 (update_evar_val x c ρ)) ((fix bevar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_evar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_evar (Nat.pred n) end | patt_bound_svar n => patt_bound_svar n | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bevar_subst psi x phi1 $ bevar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bevar_subst psi x phi1 ---> bevar_subst psi x phi2 | ex , phi' => ex , bevar_subst psi (S x) phi' | mu , phi' => mu , bevar_subst psi x phi' end) (patt_free_evar x) dbi ϕ)^{svar:0↦ fresh_svar ((fix bevar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_evar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_evar (Nat.pred n) end | patt_bound_svar n => patt_bound_svar n | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bevar_subst psi x phi1 $ bevar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bevar_subst psi x phi1 ---> bevar_subst psi x phi2 | ex , phi' => ex , bevar_subst psi (S x) phi' | mu , phi' => mu , bevar_subst psi x phi' end) (patt_free_evar x) dbi ϕ)}) = LeastFixpointOf (λ S0 : propset M, eval (update_svar_val (fresh_svar ((fix bevar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_evar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_evar (Nat.pred n) end | patt_bound_svar n => patt_bound_svar n | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bevar_subst psi x phi1 $ bevar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bevar_subst psi x phi1 ---> bevar_subst psi x phi2 | ex , phi' => ex , bevar_subst psi (S x) phi' | mu , phi' => mu , bevar_subst psi x phi' end) (patt_free_evar y) dbi ϕ)) S0 (update_evar_val y c ρ)) ((fix bevar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_evar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_evar (Nat.pred n) end | patt_bound_svar n => patt_bound_svar n | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bevar_subst psi x phi1 $ bevar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bevar_subst psi x phi1 ---> bevar_subst psi x phi2 | ex , phi' => ex , bevar_subst psi (S x) phi' | mu , phi' => mu , bevar_subst psi x phi' end) (patt_free_evar y) dbi ϕ)^{svar:0↦ fresh_svar ((fix bevar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_evar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_evar (Nat.pred n) end | patt_bound_svar n => patt_bound_svar n | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bevar_subst psi x phi1 $ bevar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bevar_subst psi x phi1 ---> bevar_subst psi x phi2 | ex , phi' => ex , bevar_subst psi (S x) phi' | mu , phi' => mu , bevar_subst psi x phi' end) (patt_free_evar y) dbi ϕ)})
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (mu , ϕ)
Hfry: evar_is_fresh_in y (mu , ϕ)

(λ S0 : propset M, eval (update_svar_val (fresh_svar ((fix bevar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_evar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_evar (Nat.pred n) end | patt_bound_svar n => patt_bound_svar n | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bevar_subst psi x phi1 $ bevar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bevar_subst psi x phi1 ---> bevar_subst psi x phi2 | ex , phi' => ex , bevar_subst psi (S x) phi' | mu , phi' => mu , bevar_subst psi x phi' end) (patt_free_evar x) dbi ϕ)) S0 (update_evar_val x c ρ)) ((fix bevar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_evar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_evar (Nat.pred n) end | patt_bound_svar n => patt_bound_svar n | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bevar_subst psi x phi1 $ bevar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bevar_subst psi x phi1 ---> bevar_subst psi x phi2 | ex , phi' => ex , bevar_subst psi (S x) phi' | mu , phi' => mu , bevar_subst psi x phi' end) (patt_free_evar x) dbi ϕ)^{svar:0↦fresh_svar ((fix bevar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_evar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_evar (Nat.pred n) end | patt_bound_svar n => patt_bound_svar n | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bevar_subst psi x phi1 $ bevar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bevar_subst psi x phi1 ---> bevar_subst psi x phi2 | ex , phi' => ex , bevar_subst psi (S x) phi' | mu , phi' => mu , bevar_subst psi x phi' end) (patt_free_evar x) dbi ϕ)}) = (λ S0 : propset M, eval (update_svar_val (fresh_svar ((fix bevar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_evar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_evar (Nat.pred n) end | patt_bound_svar n => patt_bound_svar n | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bevar_subst psi x phi1 $ bevar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bevar_subst psi x phi1 ---> bevar_subst psi x phi2 | ex , phi' => ex , bevar_subst psi (S x) phi' | mu , phi' => mu , bevar_subst psi x phi' end) (patt_free_evar y) dbi ϕ)) S0 (update_evar_val y c ρ)) ((fix bevar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_evar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_evar (Nat.pred n) end | patt_bound_svar n => patt_bound_svar n | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bevar_subst psi x phi1 $ bevar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bevar_subst psi x phi1 ---> bevar_subst psi x phi2 | ex , phi' => ex , bevar_subst psi (S x) phi' | mu , phi' => mu , bevar_subst psi x phi' end) (patt_free_evar y) dbi ϕ)^{svar:0↦fresh_svar ((fix bevar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_evar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_evar (Nat.pred n) end | patt_bound_svar n => patt_bound_svar n | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bevar_subst psi x phi1 $ bevar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bevar_subst psi x phi1 ---> bevar_subst psi x phi2 | ex , phi' => ex , bevar_subst psi (S x) phi' | mu , phi' => mu , bevar_subst psi x phi' end) (patt_free_evar y) dbi ϕ)})
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (mu , ϕ)
Hfry: evar_is_fresh_in y (mu , ϕ)

x0 : propset M, eval (update_svar_val (fresh_svar ((fix bevar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_evar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_evar (Nat.pred n) end | patt_bound_svar n => patt_bound_svar n | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bevar_subst psi x phi1 $ bevar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bevar_subst psi x phi1 ---> bevar_subst psi x phi2 | ex , phi' => ex , bevar_subst psi (S x) phi' | mu , phi' => mu , bevar_subst psi x phi' end) (patt_free_evar x) dbi ϕ)) x0 (update_evar_val x c ρ)) ((fix bevar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_evar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_evar (Nat.pred n) end | patt_bound_svar n => patt_bound_svar n | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bevar_subst psi x phi1 $ bevar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bevar_subst psi x phi1 ---> bevar_subst psi x phi2 | ex , phi' => ex , bevar_subst psi (S x) phi' | mu , phi' => mu , bevar_subst psi x phi' end) (patt_free_evar x) dbi ϕ)^{svar:0↦fresh_svar ((fix bevar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_evar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_evar (Nat.pred n) end | patt_bound_svar n => patt_bound_svar n | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bevar_subst psi x phi1 $ bevar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bevar_subst psi x phi1 ---> bevar_subst psi x phi2 | ex , phi' => ex , bevar_subst psi (S x) phi' | mu , phi' => mu , bevar_subst psi x phi' end) (patt_free_evar x) dbi ϕ)} = eval (update_svar_val (fresh_svar ((fix bevar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_evar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_evar (Nat.pred n) end | patt_bound_svar n => patt_bound_svar n | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bevar_subst psi x phi1 $ bevar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bevar_subst psi x phi1 ---> bevar_subst psi x phi2 | ex , phi' => ex , bevar_subst psi (S x) phi' | mu , phi' => mu , bevar_subst psi x phi' end) (patt_free_evar y) dbi ϕ)) x0 (update_evar_val y c ρ)) ((fix bevar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_evar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_evar (Nat.pred n) end | patt_bound_svar n => patt_bound_svar n | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bevar_subst psi x phi1 $ bevar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bevar_subst psi x phi1 ---> bevar_subst psi x phi2 | ex , phi' => ex , bevar_subst psi (S x) phi' | mu , phi' => mu , bevar_subst psi x phi' end) (patt_free_evar y) dbi ϕ)^{svar:0↦fresh_svar ((fix bevar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_evar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_evar (Nat.pred n) end | patt_bound_svar n => patt_bound_svar n | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bevar_subst psi x phi1 $ bevar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bevar_subst psi x phi1 ---> bevar_subst psi x phi2 | ex , phi' => ex , bevar_subst psi (S x) phi' | mu , phi' => mu , bevar_subst psi x phi' end) (patt_free_evar y) dbi ϕ)}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (mu , ϕ)
Hfry: evar_is_fresh_in y (mu , ϕ)
S': propset M

eval (update_svar_val (fresh_svar ((fix bevar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_evar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_evar (Nat.pred n) end | patt_bound_svar n => patt_bound_svar n | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bevar_subst psi x phi1 $ bevar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bevar_subst psi x phi1 ---> bevar_subst psi x phi2 | ex , phi' => ex , bevar_subst psi (S x) phi' | mu , phi' => mu , bevar_subst psi x phi' end) (patt_free_evar x) dbi ϕ)) S' (update_evar_val x c ρ)) ((fix bevar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_evar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_evar (Nat.pred n) end | patt_bound_svar n => patt_bound_svar n | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bevar_subst psi x phi1 $ bevar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bevar_subst psi x phi1 ---> bevar_subst psi x phi2 | ex , phi' => ex , bevar_subst psi (S x) phi' | mu , phi' => mu , bevar_subst psi x phi' end) (patt_free_evar x) dbi ϕ)^{svar:0↦fresh_svar ((fix bevar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_evar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_evar (Nat.pred n) end | patt_bound_svar n => patt_bound_svar n | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bevar_subst psi x phi1 $ bevar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bevar_subst psi x phi1 ---> bevar_subst psi x phi2 | ex , phi' => ex , bevar_subst psi (S x) phi' | mu , phi' => mu , bevar_subst psi x phi' end) (patt_free_evar x) dbi ϕ)} = eval (update_svar_val (fresh_svar ((fix bevar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_evar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_evar (Nat.pred n) end | patt_bound_svar n => patt_bound_svar n | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bevar_subst psi x phi1 $ bevar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bevar_subst psi x phi1 ---> bevar_subst psi x phi2 | ex , phi' => ex , bevar_subst psi (S x) phi' | mu , phi' => mu , bevar_subst psi x phi' end) (patt_free_evar y) dbi ϕ)) S' (update_evar_val y c ρ)) ((fix bevar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_evar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_evar (Nat.pred n) end | patt_bound_svar n => patt_bound_svar n | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bevar_subst psi x phi1 $ bevar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bevar_subst psi x phi1 ---> bevar_subst psi x phi2 | ex , phi' => ex , bevar_subst psi (S x) phi' | mu , phi' => mu , bevar_subst psi x phi' end) (patt_free_evar y) dbi ϕ)^{svar:0↦fresh_svar ((fix bevar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_evar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_evar (Nat.pred n) end | patt_bound_svar n => patt_bound_svar n | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bevar_subst psi x phi1 $ bevar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bevar_subst psi x phi1 ---> bevar_subst psi x phi2 | ex , phi' => ex , bevar_subst psi (S x) phi' | mu , phi' => mu , bevar_subst psi x phi' end) (patt_free_evar y) dbi ϕ)}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (mu , ϕ)
Hfry: evar_is_fresh_in y (mu , ϕ)
S': propset M

eval (update_svar_val (fresh_svar ((fix bevar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_evar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_evar (Nat.pred n) end | patt_bound_svar n => patt_bound_svar n | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bevar_subst psi x phi1 $ bevar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bevar_subst psi x phi1 ---> bevar_subst psi x phi2 | ex , phi' => ex , bevar_subst psi (S x) phi' | mu , phi' => mu , bevar_subst psi x phi' end) (patt_free_evar x) dbi ϕ)) S' (update_evar_val x c ρ)) ϕ^{svar:0↦fresh_svar ((fix bevar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_evar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_evar (Nat.pred n) end | patt_bound_svar n => patt_bound_svar n | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bevar_subst psi x phi1 $ bevar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bevar_subst psi x phi1 ---> bevar_subst psi x phi2 | ex , phi' => ex , bevar_subst psi (S x) phi' | mu , phi' => mu , bevar_subst psi x phi' end) (patt_free_evar x) dbi ϕ)}^{evar:dbi↦x} = eval (update_svar_val (fresh_svar ((fix bevar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_evar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_evar (Nat.pred n) end | patt_bound_svar n => patt_bound_svar n | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bevar_subst psi x phi1 $ bevar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bevar_subst psi x phi1 ---> bevar_subst psi x phi2 | ex , phi' => ex , bevar_subst psi (S x) phi' | mu , phi' => mu , bevar_subst psi x phi' end) (patt_free_evar y) dbi ϕ)) S' (update_evar_val y c ρ)) ϕ^{svar:0↦fresh_svar ((fix bevar_subst (psi : Pattern) (x : db_index) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x' => patt_free_evar x' | patt_free_svar x' => patt_free_svar x' | patt_bound_evar n => match compare_nat n x with | Nat_less _ _ _ => patt_bound_evar n | Nat_equal _ _ _ => psi | Nat_greater _ _ _ => patt_bound_evar (Nat.pred n) end | patt_bound_svar n => patt_bound_svar n | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => bevar_subst psi x phi1 $ bevar_subst psi x phi2 | ⊥ => ⊥ | phi1 ---> phi2 => bevar_subst psi x phi1 ---> bevar_subst psi x phi2 | ex , phi' => ex , bevar_subst psi (S x) phi' | mu , phi' => mu , bevar_subst psi x phi' end) (patt_free_evar y) dbi ϕ)}^{evar:dbi↦y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (mu , ϕ)
Hfry: evar_is_fresh_in y (mu , ϕ)
S': propset M

eval (update_svar_val (fresh_svar ϕ^[evar:dbi↦patt_free_evar x]) S' (update_evar_val x c ρ)) ϕ^{svar:0↦fresh_svar ϕ^[evar:dbi↦patt_free_evar x]}^{evar:dbi↦x} = eval (update_svar_val (fresh_svar ϕ^[evar:dbi↦patt_free_evar y]) S' (update_evar_val y c ρ)) ϕ^{svar:0↦fresh_svar ϕ^[evar:dbi↦patt_free_evar y]}^{evar:dbi↦y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (mu , ϕ)
Hfry: evar_is_fresh_in y (mu , ϕ)
S': propset M

eval (update_evar_val x c (update_svar_val (fresh_svar ϕ^[evar:dbi↦patt_free_evar x]) S' ρ)) ϕ^{svar:0↦fresh_svar ϕ^[evar:dbi↦patt_free_evar x]}^{evar:dbi↦x} = eval (update_evar_val y c (update_svar_val (fresh_svar ϕ^[evar:dbi↦patt_free_evar y]) S' ρ)) ϕ^{svar:0↦fresh_svar ϕ^[evar:dbi↦patt_free_evar y]}^{evar:dbi↦y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (mu , ϕ)
Hfry: evar_is_fresh_in y (mu , ϕ)
S': propset M

size ϕ^{svar:0↦fresh_svar ϕ^[evar:dbi↦patt_free_evar x]} ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (mu , ϕ)
Hfry: evar_is_fresh_in y (mu , ϕ)
S': propset M
evar_is_fresh_in x ϕ^{svar:0↦fresh_svar ϕ^[evar:dbi↦patt_free_evar x]}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (mu , ϕ)
Hfry: evar_is_fresh_in y (mu , ϕ)
S': propset M
evar_is_fresh_in y ϕ^{svar:0↦fresh_svar ϕ^[evar:dbi↦patt_free_evar x]}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (mu , ϕ)
Hfry: evar_is_fresh_in y (mu , ϕ)
S': propset M
eval (update_evar_val y c (update_svar_val (fresh_svar ϕ^[evar:dbi↦patt_free_evar x]) S' ρ)) ϕ^{svar:0↦fresh_svar ϕ^[evar:dbi↦patt_free_evar x]}^{evar:dbi↦y} = eval (update_evar_val y c (update_svar_val (fresh_svar ϕ^[evar:dbi↦patt_free_evar y]) S' ρ)) ϕ^{svar:0↦fresh_svar ϕ^[evar:dbi↦patt_free_evar y]}^{evar:dbi↦y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (mu , ϕ)
Hfry: evar_is_fresh_in y (mu , ϕ)
S': propset M

size ϕ ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (mu , ϕ)
Hfry: evar_is_fresh_in y (mu , ϕ)
S': propset M
evar_is_fresh_in x ϕ^{svar:0↦fresh_svar ϕ^[evar:dbi↦patt_free_evar x]}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (mu , ϕ)
Hfry: evar_is_fresh_in y (mu , ϕ)
S': propset M
evar_is_fresh_in y ϕ^{svar:0↦fresh_svar ϕ^[evar:dbi↦patt_free_evar x]}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (mu , ϕ)
Hfry: evar_is_fresh_in y (mu , ϕ)
S': propset M
eval (update_evar_val y c (update_svar_val (fresh_svar ϕ^[evar:dbi↦patt_free_evar x]) S' ρ)) ϕ^{svar:0↦fresh_svar ϕ^[evar:dbi↦patt_free_evar x]}^{evar:dbi↦y} = eval (update_evar_val y c (update_svar_val (fresh_svar ϕ^[evar:dbi↦patt_free_evar y]) S' ρ)) ϕ^{svar:0↦fresh_svar ϕ^[evar:dbi↦patt_free_evar y]}^{evar:dbi↦y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (mu , ϕ)
Hfry: evar_is_fresh_in y (mu , ϕ)
S': propset M

evar_is_fresh_in x ϕ^{svar:0↦fresh_svar ϕ^[evar:dbi↦patt_free_evar x]}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (mu , ϕ)
Hfry: evar_is_fresh_in y (mu , ϕ)
S': propset M
evar_is_fresh_in y ϕ^{svar:0↦fresh_svar ϕ^[evar:dbi↦patt_free_evar x]}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (mu , ϕ)
Hfry: evar_is_fresh_in y (mu , ϕ)
S': propset M
eval (update_evar_val y c (update_svar_val (fresh_svar ϕ^[evar:dbi↦patt_free_evar x]) S' ρ)) ϕ^{svar:0↦fresh_svar ϕ^[evar:dbi↦patt_free_evar x]}^{evar:dbi↦y} = eval (update_evar_val y c (update_svar_val (fresh_svar ϕ^[evar:dbi↦patt_free_evar y]) S' ρ)) ϕ^{svar:0↦fresh_svar ϕ^[evar:dbi↦patt_free_evar y]}^{evar:dbi↦y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (mu , (mu , ϕ))
Hfry: evar_is_fresh_in y (mu , ϕ)
S': propset M

evar_is_fresh_in x ϕ^{svar:0↦fresh_svar ϕ^[evar:dbi↦patt_free_evar x]}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (mu , ϕ)
Hfry: evar_is_fresh_in y (mu , ϕ)
S': propset M
evar_is_fresh_in y ϕ^{svar:0↦fresh_svar ϕ^[evar:dbi↦patt_free_evar x]}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (mu , ϕ)
Hfry: evar_is_fresh_in y (mu , ϕ)
S': propset M
eval (update_evar_val y c (update_svar_val (fresh_svar ϕ^[evar:dbi↦patt_free_evar x]) S' ρ)) ϕ^{svar:0↦fresh_svar ϕ^[evar:dbi↦patt_free_evar x]}^{evar:dbi↦y} = eval (update_evar_val y c (update_svar_val (fresh_svar ϕ^[evar:dbi↦patt_free_evar y]) S' ρ)) ϕ^{svar:0↦fresh_svar ϕ^[evar:dbi↦patt_free_evar y]}^{evar:dbi↦y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (mu , (mu , ϕ))
Hfry: evar_is_fresh_in y (mu , (mu , ϕ))
S': propset M

evar_is_fresh_in x ϕ^{svar:0↦fresh_svar ϕ^[evar:dbi↦patt_free_evar x]}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (mu , ϕ)
Hfry: evar_is_fresh_in y (mu , ϕ)
S': propset M
evar_is_fresh_in y ϕ^{svar:0↦fresh_svar ϕ^[evar:dbi↦patt_free_evar x]}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (mu , ϕ)
Hfry: evar_is_fresh_in y (mu , ϕ)
S': propset M
eval (update_evar_val y c (update_svar_val (fresh_svar ϕ^[evar:dbi↦patt_free_evar x]) S' ρ)) ϕ^{svar:0↦fresh_svar ϕ^[evar:dbi↦patt_free_evar x]}^{evar:dbi↦y} = eval (update_evar_val y c (update_svar_val (fresh_svar ϕ^[evar:dbi↦patt_free_evar y]) S' ρ)) ϕ^{svar:0↦fresh_svar ϕ^[evar:dbi↦patt_free_evar y]}^{evar:dbi↦y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (mu , (mu , ϕ))
Hfry: evar_is_fresh_in y (mu , (mu , ϕ))
S': propset M

evar_is_fresh_in x ϕ
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (mu , ϕ)
Hfry: evar_is_fresh_in y (mu , ϕ)
S': propset M
evar_is_fresh_in y ϕ^{svar:0↦fresh_svar ϕ^[evar:dbi↦patt_free_evar x]}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (mu , ϕ)
Hfry: evar_is_fresh_in y (mu , ϕ)
S': propset M
eval (update_evar_val y c (update_svar_val (fresh_svar ϕ^[evar:dbi↦patt_free_evar x]) S' ρ)) ϕ^{svar:0↦fresh_svar ϕ^[evar:dbi↦patt_free_evar x]}^{evar:dbi↦y} = eval (update_evar_val y c (update_svar_val (fresh_svar ϕ^[evar:dbi↦patt_free_evar y]) S' ρ)) ϕ^{svar:0↦fresh_svar ϕ^[evar:dbi↦patt_free_evar y]}^{evar:dbi↦y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (mu , ϕ)
Hfry: evar_is_fresh_in y (mu , ϕ)
S': propset M

evar_is_fresh_in y ϕ^{svar:0↦fresh_svar ϕ^[evar:dbi↦patt_free_evar x]}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (mu , ϕ)
Hfry: evar_is_fresh_in y (mu , ϕ)
S': propset M
eval (update_evar_val y c (update_svar_val (fresh_svar ϕ^[evar:dbi↦patt_free_evar x]) S' ρ)) ϕ^{svar:0↦fresh_svar ϕ^[evar:dbi↦patt_free_evar x]}^{evar:dbi↦y} = eval (update_evar_val y c (update_svar_val (fresh_svar ϕ^[evar:dbi↦patt_free_evar y]) S' ρ)) ϕ^{svar:0↦fresh_svar ϕ^[evar:dbi↦patt_free_evar y]}^{evar:dbi↦y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (mu , ϕ)
Hfry: evar_is_fresh_in y (mu , ϕ)
S': propset M

evar_is_fresh_in y ϕ
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (mu , ϕ)
Hfry: evar_is_fresh_in y (mu , ϕ)
S': propset M
eval (update_evar_val y c (update_svar_val (fresh_svar ϕ^[evar:dbi↦patt_free_evar x]) S' ρ)) ϕ^{svar:0↦fresh_svar ϕ^[evar:dbi↦patt_free_evar x]}^{evar:dbi↦y} = eval (update_evar_val y c (update_svar_val (fresh_svar ϕ^[evar:dbi↦patt_free_evar y]) S' ρ)) ϕ^{svar:0↦fresh_svar ϕ^[evar:dbi↦patt_free_evar y]}^{evar:dbi↦y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (mu , ϕ)
Hfry: evar_is_fresh_in y (mu , ϕ)
S': propset M

eval (update_evar_val y c (update_svar_val (fresh_svar ϕ^[evar:dbi↦patt_free_evar x]) S' ρ)) ϕ^{svar:0↦fresh_svar ϕ^[evar:dbi↦patt_free_evar x]}^{evar:dbi↦y} = eval (update_evar_val y c (update_svar_val (fresh_svar ϕ^[evar:dbi↦patt_free_evar y]) S' ρ)) ϕ^{svar:0↦fresh_svar ϕ^[evar:dbi↦patt_free_evar y]}^{evar:dbi↦y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (mu , ϕ)
Hfry: evar_is_fresh_in y (mu , ϕ)
S': propset M

eval (update_evar_val y c (update_svar_val (fresh_svar ϕ^[evar:dbi↦patt_free_evar x]) S' ρ)) ϕ^{evar:dbi↦y}^{svar:0↦fresh_svar ϕ^[evar:dbi↦patt_free_evar x]} = eval (update_evar_val y c (update_svar_val (fresh_svar ϕ^[evar:dbi↦patt_free_evar y]) S' ρ)) ϕ^{evar:dbi↦y}^{svar:0↦fresh_svar ϕ^[evar:dbi↦patt_free_evar y]}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (mu , ϕ)
Hfry: evar_is_fresh_in y (mu , ϕ)
S': propset M

eval (update_svar_val (fresh_svar ϕ^[evar:dbi↦patt_free_evar x]) S' (update_evar_val y c ρ)) ϕ^{evar:dbi↦y}^{svar:0↦fresh_svar ϕ^[evar:dbi↦patt_free_evar x]} = eval (update_svar_val (fresh_svar ϕ^[evar:dbi↦patt_free_evar y]) S' (update_evar_val y c ρ)) ϕ^{evar:dbi↦y}^{svar:0↦fresh_svar ϕ^[evar:dbi↦patt_free_evar y]}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (mu , ϕ)
Hfry: evar_is_fresh_in y (mu , ϕ)
S': propset M

size ϕ^{evar:dbi↦y} ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (mu , ϕ)
Hfry: evar_is_fresh_in y (mu , ϕ)
S': propset M
svar_is_fresh_in (fresh_svar ϕ^[evar:dbi↦patt_free_evar x]) ϕ^{evar:dbi↦y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (mu , ϕ)
Hfry: evar_is_fresh_in y (mu , ϕ)
S': propset M
svar_is_fresh_in (fresh_svar ϕ^{evar:dbi↦y}) ϕ^{evar:dbi↦y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (mu , ϕ)
Hfry: evar_is_fresh_in y (mu , ϕ)
S': propset M
eval (update_svar_val (fresh_svar ϕ^{evar:dbi↦y}) S' (update_evar_val y c ρ)) ϕ^{evar:dbi↦y}^{svar:0↦ fresh_svar ϕ^{evar:dbi↦y}} = eval (update_svar_val (fresh_svar ϕ^[evar:dbi↦patt_free_evar y]) S' (update_evar_val y c ρ)) ϕ^{evar:dbi↦y}^{svar:0↦ fresh_svar ϕ^[evar:dbi↦ patt_free_evar y]}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (mu , ϕ)
Hfry: evar_is_fresh_in y (mu , ϕ)
S': propset M

size ϕ ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (mu , ϕ)
Hfry: evar_is_fresh_in y (mu , ϕ)
S': propset M
svar_is_fresh_in (fresh_svar ϕ^[evar:dbi↦patt_free_evar x]) ϕ^{evar:dbi↦y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (mu , ϕ)
Hfry: evar_is_fresh_in y (mu , ϕ)
S': propset M
svar_is_fresh_in (fresh_svar ϕ^{evar:dbi↦y}) ϕ^{evar:dbi↦y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (mu , ϕ)
Hfry: evar_is_fresh_in y (mu , ϕ)
S': propset M
eval (update_svar_val (fresh_svar ϕ^{evar:dbi↦y}) S' (update_evar_val y c ρ)) ϕ^{evar:dbi↦y}^{svar:0↦ fresh_svar ϕ^{evar:dbi↦y}} = eval (update_svar_val (fresh_svar ϕ^[evar:dbi↦patt_free_evar y]) S' (update_evar_val y c ρ)) ϕ^{evar:dbi↦y}^{svar:0↦ fresh_svar ϕ^[evar:dbi↦ patt_free_evar y]}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (mu , ϕ)
Hfry: evar_is_fresh_in y (mu , ϕ)
S': propset M

svar_is_fresh_in (fresh_svar ϕ^[evar:dbi↦patt_free_evar x]) ϕ^{evar:dbi↦y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (mu , ϕ)
Hfry: evar_is_fresh_in y (mu , ϕ)
S': propset M
svar_is_fresh_in (fresh_svar ϕ^{evar:dbi↦y}) ϕ^{evar:dbi↦y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (mu , ϕ)
Hfry: evar_is_fresh_in y (mu , ϕ)
S': propset M
eval (update_svar_val (fresh_svar ϕ^{evar:dbi↦y}) S' (update_evar_val y c ρ)) ϕ^{evar:dbi↦y}^{svar:0↦ fresh_svar ϕ^{evar:dbi↦y}} = eval (update_svar_val (fresh_svar ϕ^[evar:dbi↦patt_free_evar y]) S' (update_evar_val y c ρ)) ϕ^{evar:dbi↦y}^{svar:0↦ fresh_svar ϕ^[evar:dbi↦ patt_free_evar y]}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (mu , ϕ)
Hfry: evar_is_fresh_in y (mu , ϕ)
S': propset M

svar_is_fresh_in (fresh_svar ϕ^[evar:dbi↦patt_free_evar x]) ϕ
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (mu , ϕ)
Hfry: evar_is_fresh_in y (mu , ϕ)
S': propset M
svar_is_fresh_in (fresh_svar ϕ^{evar:dbi↦y}) ϕ^{evar:dbi↦y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (mu , ϕ)
Hfry: evar_is_fresh_in y (mu , ϕ)
S': propset M
eval (update_svar_val (fresh_svar ϕ^{evar:dbi↦y}) S' (update_evar_val y c ρ)) ϕ^{evar:dbi↦y}^{svar:0↦ fresh_svar ϕ^{evar:dbi↦y}} = eval (update_svar_val (fresh_svar ϕ^[evar:dbi↦patt_free_evar y]) S' (update_evar_val y c ρ)) ϕ^{evar:dbi↦y}^{svar:0↦ fresh_svar ϕ^[evar:dbi↦ patt_free_evar y]}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (mu , ϕ)
Hfry: evar_is_fresh_in y (mu , ϕ)
S': propset M

svar_is_fresh_in (fresh_svar ϕ) ϕ
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (mu , ϕ)
Hfry: evar_is_fresh_in y (mu , ϕ)
S': propset M
svar_is_fresh_in (fresh_svar ϕ^{evar:dbi↦y}) ϕ^{evar:dbi↦y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (mu , ϕ)
Hfry: evar_is_fresh_in y (mu , ϕ)
S': propset M
eval (update_svar_val (fresh_svar ϕ^{evar:dbi↦y}) S' (update_evar_val y c ρ)) ϕ^{evar:dbi↦y}^{svar:0↦ fresh_svar ϕ^{evar:dbi↦y}} = eval (update_svar_val (fresh_svar ϕ^[evar:dbi↦patt_free_evar y]) S' (update_evar_val y c ρ)) ϕ^{evar:dbi↦y}^{svar:0↦ fresh_svar ϕ^[evar:dbi↦ patt_free_evar y]}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (mu , ϕ)
Hfry: evar_is_fresh_in y (mu , ϕ)
S': propset M

svar_is_fresh_in (fresh_svar ϕ^{evar:dbi↦y}) ϕ^{evar:dbi↦y}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (mu , ϕ)
Hfry: evar_is_fresh_in y (mu , ϕ)
S': propset M
eval (update_svar_val (fresh_svar ϕ^{evar:dbi↦y}) S' (update_evar_val y c ρ)) ϕ^{evar:dbi↦y}^{svar:0↦ fresh_svar ϕ^{evar:dbi↦y}} = eval (update_svar_val (fresh_svar ϕ^[evar:dbi↦patt_free_evar y]) S' (update_evar_val y c ρ)) ϕ^{evar:dbi↦y}^{svar:0↦ fresh_svar ϕ^[evar:dbi↦ patt_free_evar y]}
signature: Signature
M: Model
sz: nat
IHsz: (ϕ : Pattern) (dbi : db_index) (ρ : Valuation), size ϕ ≤ sz → ( (X Y : svar) (S : propset M), svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}) ∧ ( (x y : evar) (c : M), evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y})
ϕ: Pattern
dbi: db_index
ρ: Valuation
Hsz: S (size ϕ) ≤ S sz
x, y: evar
c: M
Hfrx: evar_is_fresh_in x (mu , ϕ)
Hfry: evar_is_fresh_in y (mu , ϕ)
S': propset M

eval (update_svar_val (fresh_svar ϕ^{evar:dbi↦y}) S' (update_evar_val y c ρ)) ϕ^{evar:dbi↦y}^{svar:0↦fresh_svar ϕ^{evar:dbi↦y}} = eval (update_svar_val (fresh_svar ϕ^[evar:dbi↦patt_free_evar y]) S' (update_evar_val y c ρ)) ϕ^{evar:dbi↦y}^{svar:0↦fresh_svar ϕ^[evar:dbi↦patt_free_evar y]}
reflexivity. } Qed.
signature: Signature
M: Model
ϕ: Pattern
x, y: evar
c: M
dbi: db_index
ρ: Valuation

evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y}
signature: Signature
M: Model
ϕ: Pattern
x, y: evar
c: M
dbi: db_index
ρ: Valuation

evar_is_fresh_in x ϕ → evar_is_fresh_in y ϕ → eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y}
signature: Signature
M: Model
ϕ: Pattern
x, y: evar
c: M
dbi: db_index
ρ: Valuation
Hfrx: evar_is_fresh_in x ϕ
Hfry: evar_is_fresh_in y ϕ

eval (update_evar_val x c ρ) ϕ^{evar:dbi↦x} = eval (update_evar_val y c ρ) ϕ^{evar:dbi↦y}
eapply (proj2 (Private_eval_fresh_var_open (size ϕ) ϕ dbi ρ _) x y c); assumption.
signature: Signature
M: Model
ϕ: Pattern
x, y: evar
c: M
dbi: db_index
ρ: Valuation
Hfrx: evar_is_fresh_in x ϕ
Hfry: evar_is_fresh_in y ϕ

size ϕ ≤ size ϕ
lia. Qed.
signature: Signature
M: Model
ϕ: Pattern
X, Y: svar
S: propset M
dbi: db_index
ρ: Valuation

svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}
signature: Signature
M: Model
ϕ: Pattern
X, Y: svar
S: propset M
dbi: db_index
ρ: Valuation

svar_is_fresh_in X ϕ → svar_is_fresh_in Y ϕ → eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}
signature: Signature
M: Model
ϕ: Pattern
X, Y: svar
S: propset M
dbi: db_index
ρ: Valuation
HfrX: svar_is_fresh_in X ϕ
HfrY: svar_is_fresh_in Y ϕ

eval (update_svar_val X S ρ) ϕ^{svar:dbi↦X} = eval (update_svar_val Y S ρ) ϕ^{svar:dbi↦Y}
eapply (proj1 (Private_eval_fresh_var_open (size ϕ) ϕ dbi ρ _) X Y S); assumption.
signature: Signature
M: Model
ϕ: Pattern
X, Y: svar
S: propset M
dbi: db_index
ρ: Valuation
HfrX: svar_is_fresh_in X ϕ
HfrY: svar_is_fresh_in Y ϕ

size ϕ ≤ size ϕ
lia. Qed. (* There are two ways how to plug a pattern phi2 into a pattern phi1: either substitute it for some variable, or evaluate phi2 first and then evaluate phi1 with valuation updated to the result of phi2 *)
signature: Signature
M: Model

(sz : nat) (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
signature: Signature
M: Model

(sz : nat) (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
signature: Signature
M: Model
dbi: db_index
phi1, phi2: Pattern
Hsz: size phi1 ≤ 0
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux phi1 (S dbi)
H: X ∉ free_svars phi1

eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size phi1 ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux phi1 (S dbi)
H: X ∉ free_svars phi1
eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
signature: Signature
M: Model
dbi: db_index
phi1, phi2: Pattern
Hsz: size phi1 ≤ 0
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux phi1 (S dbi)
H: X ∉ free_svars phi1

eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
signature: Signature
M: Model
dbi: db_index
x: evar
phi2: Pattern
Hsz: 00
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (patt_free_evar x) (S dbi)
H: X ∉ free_svars (patt_free_evar x)

eval ρ (patt_free_evar x) = eval (update_svar_val X (eval ρ phi2) ρ) (patt_free_evar x)^{svar:dbi↦X}
signature: Signature
M: Model
dbi: db_index
x: svar
phi2: Pattern
Hsz: 00
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (patt_free_svar x) (S dbi)
H: X ∉ free_svars (patt_free_svar x)
eval ρ (patt_free_svar x) = eval (update_svar_val X (eval ρ phi2) ρ) (patt_free_svar x)^{svar:dbi↦X}
signature: Signature
M: Model
dbi, n: db_index
phi2: Pattern
Hsz: 00
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (patt_bound_evar n) (S dbi)
H: X ∉ free_svars (patt_bound_evar n)
eval ρ (patt_bound_evar n) = eval (update_svar_val X (eval ρ phi2) ρ) (patt_bound_evar n)^{svar:dbi↦X}
signature: Signature
M: Model
dbi, n: db_index
phi2: Pattern
Hsz: 00
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (patt_bound_svar n) (S dbi)
H: X ∉ free_svars (patt_bound_svar n)
eval ρ match compare_nat n dbi with | Nat_less _ _ _ => patt_bound_svar n | Nat_equal _ _ _ => phi2 | Nat_greater _ _ _ => patt_bound_svar (Nat.pred n) end = eval (update_svar_val X (eval ρ phi2) ρ) (patt_bound_svar n)^{svar:dbi↦X}
signature: Signature
M: Model
dbi: db_index
sigma: symbols
phi2: Pattern
Hsz: 00
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (patt_sym sigma) (S dbi)
H: X ∉ free_svars (patt_sym sigma)
eval ρ (patt_sym sigma) = eval (update_svar_val X (eval ρ phi2) ρ) (patt_sym sigma)^{svar:dbi↦X}
signature: Signature
M: Model
dbi: db_index
phi1_1, phi1_2, phi2: Pattern
Hsz: S (size phi1_1 + size phi1_2) ≤ 0
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (phi1_1 $ phi1_2) (S dbi)
H: X ∉ free_svars (phi1_1 $ phi1_2)
eval ρ (phi1_1^[svar:dbi↦phi2] $ phi1_2^[svar:dbi↦phi2]) = eval (update_svar_val X (eval ρ phi2) ρ) (phi1_1 $ phi1_2)^{svar:dbi↦X}
signature: Signature
M: Model
dbi: db_index
phi2: Pattern
Hsz: 00
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux ⊥ (S dbi)
H: X ∉ free_svars ⊥
eval ρ ⊥ = eval (update_svar_val X (eval ρ phi2) ρ) ⊥^{svar:dbi↦X}
signature: Signature
M: Model
dbi: db_index
phi1_1, phi1_2, phi2: Pattern
Hsz: S (size phi1_1 + size phi1_2) ≤ 0
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (phi1_1 ---> phi1_2) (S dbi)
H: X ∉ free_svars (phi1_1 ---> phi1_2)
eval ρ (phi1_1^[svar:dbi↦phi2] ---> phi1_2^[svar:dbi↦phi2]) = eval (update_svar_val X (eval ρ phi2) ρ) (phi1_1 ---> phi1_2)^{svar:dbi↦X}
signature: Signature
M: Model
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ 0
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (ex , phi1) (S dbi)
H: X ∉ free_svars (ex , phi1)
eval ρ (ex , phi1^[svar:dbi↦phi2]) = eval (update_svar_val X (eval ρ phi2) ρ) (ex , phi1)^{svar:dbi↦X}
signature: Signature
M: Model
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ 0
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
eval ρ (mu , phi1^[svar:S dbi↦phi2]) = eval (update_svar_val X (eval ρ phi2) ρ) (mu , phi1)^{svar:dbi↦X}
signature: Signature
M: Model
dbi: db_index
x: evar
phi2: Pattern
Hsz: 00
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (patt_free_evar x) (S dbi)
H: X ∉ free_svars (patt_free_evar x)

eval ρ (patt_free_evar x) = eval (update_svar_val X (eval ρ phi2) ρ) (patt_free_evar x)^{svar:dbi↦X}
signature: Signature
M: Model
dbi: db_index
x: evar
phi2: Pattern
Hsz: 00
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (patt_free_evar x) (S dbi)
H: X ∉ free_svars (patt_free_evar x)

{[evar_valuation ρ x]} = eval (update_svar_val X (eval ρ phi2) ρ) (patt_free_evar x)^{svar:dbi↦X}
auto.
signature: Signature
M: Model
dbi: db_index
x: svar
phi2: Pattern
Hsz: 00
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (patt_free_svar x) (S dbi)
H: X ∉ free_svars (patt_free_svar x)

eval ρ (patt_free_svar x) = eval (update_svar_val X (eval ρ phi2) ρ) (patt_free_svar x)^{svar:dbi↦X}
signature: Signature
M: Model
dbi: db_index
x: svar
phi2: Pattern
Hsz: 00
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (patt_free_svar x) (S dbi)
H: X ∉ free_svars (patt_free_svar x)

eval ρ (patt_free_svar x) = eval (update_svar_val X (eval ρ phi2) ρ) (patt_free_svar x)^[svar:dbi↦patt_free_svar X]
signature: Signature
M: Model
dbi: db_index
x: svar
phi2: Pattern
Hsz: 00
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (patt_free_svar x) (S dbi)
H: X ∉ free_svars (patt_free_svar x)

eval ρ (patt_free_svar x) = eval (update_svar_val X (eval ρ phi2) ρ) (patt_free_svar x)
signature: Signature
M: Model
dbi: db_index
x: svar
phi2: Pattern
Hsz: 00
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (patt_free_svar x) (S dbi)
H: X ∉ free_svars (patt_free_svar x)

svar_valuation ρ x = svar_valuation (update_svar_val X (eval ρ phi2) ρ) x
signature: Signature
M: Model
dbi: db_index
x: svar
phi2: Pattern
Hsz: 00
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (patt_free_svar x) (S dbi)
H: X ∉ free_svars (patt_free_svar x)

svar_valuation ρ x = svar_valuation {| evar_valuation := evar_valuation ρ; svar_valuation := λ sv' : svar, if decide (X = sv') then eval ρ phi2 else svar_valuation ρ sv' |} x
signature: Signature
M: Model
dbi: db_index
x: svar
phi2: Pattern
Hsz: 00
ρₑ: evar → M
ρₛ: svar → propset M
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (patt_free_svar x) (S dbi)
H: X ∉ free_svars (patt_free_svar x)

svar_valuation {| evar_valuation := ρₑ; svar_valuation := ρₛ |} x = svar_valuation {| evar_valuation := evar_valuation {| evar_valuation := ρₑ; svar_valuation := ρₛ |}; svar_valuation := λ sv' : svar, if decide (X = sv') then eval {| evar_valuation := ρₑ; svar_valuation := ρₛ |} phi2 else svar_valuation {| evar_valuation := ρₑ; svar_valuation := ρₛ |} sv' |} x
signature: Signature
M: Model
dbi: db_index
x: svar
phi2: Pattern
Hsz: 00
ρₑ: evar → M
ρₛ: svar → propset M
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (patt_free_svar x) (S dbi)
H: X ∉ free_svars (patt_free_svar x)

ρₛ x = (if decide (X = x) then eval {| evar_valuation := ρₑ; svar_valuation := ρₛ |} phi2 else ρₛ x)
signature: Signature
M: Model
dbi: db_index
x: svar
phi2: Pattern
Hsz: 00
ρₑ: evar → M
ρₛ: svar → propset M
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (patt_free_svar x) (S dbi)
H: X ∉ free_svars (patt_free_svar x)
e: X = x

ρₛ x = eval {| evar_valuation := ρₑ; svar_valuation := ρₛ |} phi2
signature: Signature
M: Model
dbi: db_index
x: svar
phi2: Pattern
Hsz: 00
ρₑ: evar → M
ρₛ: svar → propset M
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (patt_free_svar x) (S dbi)
H: X ∉ free_svars (patt_free_svar x)
n: X ≠ x
ρₛ x = ρₛ x
signature: Signature
M: Model
dbi: db_index
x: svar
phi2: Pattern
Hsz: 00
ρₑ: evar → M
ρₛ: svar → propset M
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (patt_free_svar x) (S dbi)
H: X ∉ free_svars (patt_free_svar x)
e: X = x

ρₛ x = eval {| evar_valuation := ρₑ; svar_valuation := ρₛ |} phi2
signature: Signature
M: Model
dbi: db_index
x: svar
phi2: Pattern
Hsz: 00
ρₑ: evar → M
ρₛ: svar → propset M
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (patt_free_svar x) (S dbi)
H: X ∉ {[x]}
e: X = x

ρₛ x = eval {| evar_valuation := ρₑ; svar_valuation := ρₛ |} phi2
signature: Signature
M: Model
dbi: db_index
x: svar
phi2: Pattern
Hsz: 00
ρₑ: evar → M
ρₛ: svar → propset M
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (patt_free_svar x) (S dbi)
H: X ∉ {[x]}
e: X = x

ρₛ x = eval {| evar_valuation := ρₑ; svar_valuation := ρₛ |} phi2
signature: Signature
M: Model
dbi: db_index
x: svar
phi2: Pattern
Hsz: 00
ρₑ: evar → M
ρₛ: svar → propset M
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (patt_free_svar x) (S dbi)
H: X ∈ {[x]} → False
e: X = x

ρₛ x = eval {| evar_valuation := ρₑ; svar_valuation := ρₛ |} phi2
signature: Signature
M: Model
dbi: db_index
x: svar
phi2: Pattern
Hsz: 00
ρₑ: evar → M
ρₛ: svar → propset M
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (patt_free_svar x) (S dbi)
H: X ∈ {[x]} → False
e: X = x

False
signature: Signature
M: Model
dbi: db_index
x: svar
phi2: Pattern
Hsz: 00
ρₑ: evar → M
ρₛ: svar → propset M
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (patt_free_svar x) (S dbi)
H: X ∈ {[x]} → False
e: X = x

X ∈ {[x]}
signature: Signature
M: Model
dbi: db_index
x: svar
phi2: Pattern
Hsz: 00
ρₑ: evar → M
ρₛ: svar → propset M
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (patt_free_svar x) (S dbi)
H: X ∈ {[x]} → False
e: X = x

X = x
auto.
signature: Signature
M: Model
dbi: db_index
x: svar
phi2: Pattern
Hsz: 00
ρₑ: evar → M
ρₛ: svar → propset M
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (patt_free_svar x) (S dbi)
H: X ∉ free_svars (patt_free_svar x)
n: X ≠ x

ρₛ x = ρₛ x
auto.
signature: Signature
M: Model
dbi, n: db_index
phi2: Pattern
Hsz: 00
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (patt_bound_evar n) (S dbi)
H: X ∉ free_svars (patt_bound_evar n)

eval ρ (patt_bound_evar n) = eval (update_svar_val X (eval ρ phi2) ρ) (patt_bound_evar n)^{svar:dbi↦X}
signature: Signature
M: Model
dbi, n: db_index
phi2: Pattern
Hsz: 00
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (patt_bound_evar n) (S dbi)
H: X ∉ free_svars (patt_bound_evar n)

∅ = ∅
reflexivity.
signature: Signature
M: Model
dbi, n: db_index
phi2: Pattern
Hsz: 00
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (patt_bound_svar n) (S dbi)
H: X ∉ free_svars (patt_bound_svar n)

eval ρ match compare_nat n dbi with | Nat_less _ _ _ => patt_bound_svar n | Nat_equal _ _ _ => phi2 | Nat_greater _ _ _ => patt_bound_svar (Nat.pred n) end = eval (update_svar_val X (eval ρ phi2) ρ) (patt_bound_svar n)^{svar:dbi↦X}
signature: Signature
M: Model
dbi, n: db_index
phi2: Pattern
Hsz: 00
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (patt_bound_svar n) (S dbi)
H: X ∉ free_svars (patt_bound_svar n)

eval ρ match compare_nat n dbi with | Nat_less _ _ _ => patt_bound_svar n | Nat_equal _ _ _ => phi2 | Nat_greater _ _ _ => patt_bound_svar (Nat.pred n) end = eval (update_svar_val X (eval ρ phi2) ρ) (patt_bound_svar n)^[svar:dbi↦patt_free_svar X]
signature: Signature
M: Model
dbi, n: db_index
phi2: Pattern
Hsz: 00
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (patt_bound_svar n) (S dbi)
H: X ∉ free_svars (patt_bound_svar n)

eval ρ match compare_nat n dbi with | Nat_less _ _ _ => patt_bound_svar n | Nat_equal _ _ _ => phi2 | Nat_greater _ _ _ => patt_bound_svar (Nat.pred n) end = eval (update_svar_val X (eval ρ phi2) ρ) match compare_nat n dbi with | Nat_less _ _ _ => patt_bound_svar n | Nat_equal _ _ _ => patt_free_svar X | Nat_greater _ _ _ => patt_bound_svar (Nat.pred n) end
signature: Signature
M: Model
dbi, n: db_index
phi2: Pattern
Hsz: 00
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (patt_bound_svar n) (S dbi)
H: X ∉ free_svars (patt_bound_svar n)
l: n < dbi
H0: compare_nat n dbi = Nat_less n dbi l

eval ρ (patt_bound_svar n) = eval (update_svar_val X (eval ρ phi2) ρ) (patt_bound_svar n)
signature: Signature
M: Model
dbi, n: db_index
phi2: Pattern
Hsz: 00
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (patt_bound_svar n) (S dbi)
H: X ∉ free_svars (patt_bound_svar n)
e: n = dbi
H0: compare_nat n dbi = Nat_equal n dbi e
eval ρ phi2 = eval (update_svar_val X (eval ρ phi2) ρ) (patt_free_svar X)
signature: Signature
M: Model
dbi, n: db_index
phi2: Pattern
Hsz: 00
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (patt_bound_svar n) (S dbi)
H: X ∉ free_svars (patt_bound_svar n)
g: n > dbi
H0: compare_nat n dbi = Nat_greater n dbi g
eval ρ (patt_bound_svar (Nat.pred n)) = eval (update_svar_val X (eval ρ phi2) ρ) (patt_bound_svar (Nat.pred n))
signature: Signature
M: Model
dbi, n: db_index
phi2: Pattern
Hsz: 00
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (patt_bound_svar n) (S dbi)
H: X ∉ free_svars (patt_bound_svar n)
l: n < dbi
H0: compare_nat n dbi = Nat_less n dbi l

eval ρ (patt_bound_svar n) = eval (update_svar_val X (eval ρ phi2) ρ) (patt_bound_svar n)
repeat rewrite -> eval_bound_svar_simpl; auto.
signature: Signature
M: Model
dbi, n: db_index
phi2: Pattern
Hsz: 00
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (patt_bound_svar n) (S dbi)
H: X ∉ free_svars (patt_bound_svar n)
e: n = dbi
H0: compare_nat n dbi = Nat_equal n dbi e

eval ρ phi2 = eval (update_svar_val X (eval ρ phi2) ρ) (patt_free_svar X)
signature: Signature
M: Model
dbi, n: db_index
phi2: Pattern
Hsz: 00
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (patt_bound_svar n) (S dbi)
H: X ∉ free_svars (patt_bound_svar n)
e: n = dbi
H0: compare_nat n dbi = Nat_equal n dbi e

eval ρ phi2 = svar_valuation (update_svar_val X (eval ρ phi2) ρ) X
signature: Signature
M: Model
dbi, n: db_index
phi2: Pattern
Hsz: 00
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (patt_bound_svar n) (S dbi)
H: X ∉ free_svars (patt_bound_svar n)
e: n = dbi
H0: compare_nat n dbi = Nat_equal n dbi e

eval ρ phi2 = svar_valuation {| evar_valuation := evar_valuation ρ; svar_valuation := λ sv' : svar, if decide (X = sv') then eval ρ phi2 else svar_valuation ρ sv' |} X
signature: Signature
M: Model
dbi, n: db_index
phi2: Pattern
Hsz: 00
ρₑ: evar → M
ρₛ: svar → propset M
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (patt_bound_svar n) (S dbi)
H: X ∉ free_svars (patt_bound_svar n)
e: n = dbi
H0: compare_nat n dbi = Nat_equal n dbi e

eval {| evar_valuation := ρₑ; svar_valuation := ρₛ |} phi2 = svar_valuation {| evar_valuation := evar_valuation {| evar_valuation := ρₑ; svar_valuation := ρₛ |}; svar_valuation := λ sv' : svar, if decide (X = sv') then eval {| evar_valuation := ρₑ; svar_valuation := ρₛ |} phi2 else svar_valuation {| evar_valuation := ρₑ; svar_valuation := ρₛ |} sv' |} X
signature: Signature
M: Model
dbi, n: db_index
phi2: Pattern
Hsz: 00
ρₑ: evar → M
ρₛ: svar → propset M
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (patt_bound_svar n) (S dbi)
H: X ∉ free_svars (patt_bound_svar n)
e: n = dbi
H0: compare_nat n dbi = Nat_equal n dbi e

eval {| evar_valuation := ρₑ; svar_valuation := ρₛ |} phi2 = (if decide (X = X) then eval {| evar_valuation := ρₑ; svar_valuation := ρₛ |} phi2 else ρₛ X)
signature: Signature
M: Model
dbi, n: db_index
phi2: Pattern
Hsz: 00
ρₑ: evar → M
ρₛ: svar → propset M
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (patt_bound_svar n) (S dbi)
H: X ∉ free_svars (patt_bound_svar n)
e: n = dbi
H0: compare_nat n dbi = Nat_equal n dbi e
e0: X = X

eval {| evar_valuation := ρₑ; svar_valuation := ρₛ |} phi2 = eval {| evar_valuation := ρₑ; svar_valuation := ρₛ |} phi2
signature: Signature
M: Model
dbi, n: db_index
phi2: Pattern
Hsz: 00
ρₑ: evar → M
ρₛ: svar → propset M
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (patt_bound_svar n) (S dbi)
H: X ∉ free_svars (patt_bound_svar n)
e: n = dbi
H0: compare_nat n dbi = Nat_equal n dbi e
n0: X ≠ X
eval {| evar_valuation := ρₑ; svar_valuation := ρₛ |} phi2 = ρₛ X
signature: Signature
M: Model
dbi, n: db_index
phi2: Pattern
Hsz: 00
ρₑ: evar → M
ρₛ: svar → propset M
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (patt_bound_svar n) (S dbi)
H: X ∉ free_svars (patt_bound_svar n)
e: n = dbi
H0: compare_nat n dbi = Nat_equal n dbi e
n0: X ≠ X

eval {| evar_valuation := ρₑ; svar_valuation := ρₛ |} phi2 = ρₛ X
contradiction.
signature: Signature
M: Model
dbi, n: db_index
phi2: Pattern
Hsz: 00
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (patt_bound_svar n) (S dbi)
H: X ∉ free_svars (patt_bound_svar n)
g: n > dbi
H0: compare_nat n dbi = Nat_greater n dbi g

eval ρ (patt_bound_svar (Nat.pred n)) = eval (update_svar_val X (eval ρ phi2) ρ) (patt_bound_svar (Nat.pred n))
repeat rewrite -> eval_bound_svar_simpl; auto.
signature: Signature
M: Model
dbi: db_index
sigma: symbols
phi2: Pattern
Hsz: 00
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (patt_sym sigma) (S dbi)
H: X ∉ free_svars (patt_sym sigma)

eval ρ (patt_sym sigma) = eval (update_svar_val X (eval ρ phi2) ρ) (patt_sym sigma)^{svar:dbi↦X}
signature: Signature
M: Model
dbi: db_index
sigma: symbols
phi2: Pattern
Hsz: 00
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (patt_sym sigma) (S dbi)
H: X ∉ free_svars (patt_sym sigma)

eval ρ (patt_sym sigma) = eval (update_svar_val X (eval ρ phi2) ρ) (patt_sym sigma)^{svar:dbi↦X}
repeat rewrite -> eval_sym_simpl; auto.
signature: Signature
M: Model
dbi: db_index
phi1_1, phi1_2, phi2: Pattern
Hsz: S (size phi1_1 + size phi1_2) ≤ 0
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (phi1_1 $ phi1_2) (S dbi)
H: X ∉ free_svars (phi1_1 $ phi1_2)

eval ρ (phi1_1^[svar:dbi↦phi2] $ phi1_2^[svar:dbi↦phi2]) = eval (update_svar_val X (eval ρ phi2) ρ) (phi1_1 $ phi1_2)^{svar:dbi↦X}
lia.
signature: Signature
M: Model
dbi: db_index
phi2: Pattern
Hsz: 00
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux ⊥ (S dbi)
H: X ∉ free_svars ⊥

eval ρ ⊥ = eval (update_svar_val X (eval ρ phi2) ρ) ⊥^{svar:dbi↦X}
signature: Signature
M: Model
dbi: db_index
phi2: Pattern
Hsz: 00
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux ⊥ (S dbi)
H: X ∉ free_svars ⊥

eval ρ ⊥ = eval (update_svar_val X (eval ρ phi2) ρ) ⊥^{svar:dbi↦X}
repeat rewrite eval_bott_simpl; auto.
signature: Signature
M: Model
dbi: db_index
phi1_1, phi1_2, phi2: Pattern
Hsz: S (size phi1_1 + size phi1_2) ≤ 0
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (phi1_1 ---> phi1_2) (S dbi)
H: X ∉ free_svars (phi1_1 ---> phi1_2)

eval ρ (phi1_1^[svar:dbi↦phi2] ---> phi1_2^[svar:dbi↦phi2]) = eval (update_svar_val X (eval ρ phi2) ρ) (phi1_1 ---> phi1_2)^{svar:dbi↦X}
lia.
signature: Signature
M: Model
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ 0
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (ex , phi1) (S dbi)
H: X ∉ free_svars (ex , phi1)

eval ρ (ex , phi1^[svar:dbi↦phi2]) = eval (update_svar_val X (eval ρ phi2) ρ) (ex , phi1)^{svar:dbi↦X}
lia.
signature: Signature
M: Model
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ 0
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)

eval ρ (mu , phi1^[svar:S dbi↦phi2]) = eval (update_svar_val X (eval ρ phi2) ρ) (mu , phi1)^{svar:dbi↦X}
lia.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size phi1 ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux phi1 (S dbi)
H: X ∉ free_svars phi1

eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
x: evar
phi2: Pattern
Hsz: size (patt_free_evar x) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (patt_free_evar x) (S dbi)
H: X ∉ free_svars (patt_free_evar x)

eval ρ (patt_free_evar x) = eval (update_svar_val X (eval ρ phi2) ρ) (patt_free_evar x)^{svar:dbi↦X}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
x: svar
phi2: Pattern
Hsz: size (patt_free_svar x) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (patt_free_svar x) (S dbi)
H: X ∉ free_svars (patt_free_svar x)
eval ρ (patt_free_svar x) = eval (update_svar_val X (eval ρ phi2) ρ) (patt_free_svar x)^{svar:dbi↦X}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi, n: db_index
phi2: Pattern
Hsz: size (patt_bound_evar n) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (patt_bound_evar n) (S dbi)
H: X ∉ free_svars (patt_bound_evar n)
eval ρ (patt_bound_evar n) = eval (update_svar_val X (eval ρ phi2) ρ) (patt_bound_evar n)^{svar:dbi↦X}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi, n: db_index
phi2: Pattern
Hsz: size (patt_bound_svar n) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (patt_bound_svar n) (S dbi)
H: X ∉ free_svars (patt_bound_svar n)
eval ρ match compare_nat n dbi with | Nat_less _ _ _ => patt_bound_svar n | Nat_equal _ _ _ => phi2 | Nat_greater _ _ _ => patt_bound_svar (Nat.pred n) end = eval (update_svar_val X (eval ρ phi2) ρ) (patt_bound_svar n)^{svar:dbi↦X}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
sigma: symbols
phi2: Pattern
Hsz: size (patt_sym sigma) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (patt_sym sigma) (S dbi)
H: X ∉ free_svars (patt_sym sigma)
eval ρ (patt_sym sigma) = eval (update_svar_val X (eval ρ phi2) ρ) (patt_sym sigma)^{svar:dbi↦X}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1_1, phi1_2, phi2: Pattern
Hsz: size (phi1_1 $ phi1_2) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (phi1_1 $ phi1_2) (S dbi)
H: X ∉ free_svars (phi1_1 $ phi1_2)
eval ρ (phi1_1^[svar:dbi↦phi2] $ phi1_2^[svar:dbi↦phi2]) = eval (update_svar_val X (eval ρ phi2) ρ) (phi1_1 $ phi1_2)^{svar:dbi↦X}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi2: Pattern
Hsz: size ⊥ ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux ⊥ (S dbi)
H: X ∉ free_svars ⊥
eval ρ ⊥ = eval (update_svar_val X (eval ρ phi2) ρ) ⊥^{svar:dbi↦X}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1_1, phi1_2, phi2: Pattern
Hsz: size (phi1_1 ---> phi1_2) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (phi1_1 ---> phi1_2) (S dbi)
H: X ∉ free_svars (phi1_1 ---> phi1_2)
eval ρ (phi1_1^[svar:dbi↦phi2] ---> phi1_2^[svar:dbi↦phi2]) = eval (update_svar_val X (eval ρ phi2) ρ) (phi1_1 ---> phi1_2)^{svar:dbi↦X}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (ex , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (ex , phi1) (S dbi)
H: X ∉ free_svars (ex , phi1)
eval ρ (ex , phi1^[svar:dbi↦phi2]) = eval (update_svar_val X (eval ρ phi2) ρ) (ex , phi1)^{svar:dbi↦X}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
eval ρ (mu , phi1^[svar:S dbi↦phi2]) = eval (update_svar_val X (eval ρ phi2) ρ) (mu , phi1)^{svar:dbi↦X}
(* HERE we duplicate some of the effort. I do not like it. *)
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
x: evar
phi2: Pattern
Hsz: size (patt_free_evar x) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (patt_free_evar x) (S dbi)
H: X ∉ free_svars (patt_free_evar x)

eval ρ (patt_free_evar x) = eval (update_svar_val X (eval ρ phi2) ρ) (patt_free_evar x)^{svar:dbi↦X}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
x: evar
phi2: Pattern
Hsz: size (patt_free_evar x) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (patt_free_evar x) (S dbi)
H: X ∉ free_svars (patt_free_evar x)

{[evar_valuation ρ x]} = {[evar_valuation (update_svar_val X (eval ρ phi2) ρ) x]}
auto.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
x: svar
phi2: Pattern
Hsz: size (patt_free_svar x) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (patt_free_svar x) (S dbi)
H: X ∉ free_svars (patt_free_svar x)

eval ρ (patt_free_svar x) = eval (update_svar_val X (eval ρ phi2) ρ) (patt_free_svar x)^{svar:dbi↦X}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
x: svar
phi2: Pattern
Hsz: size (patt_free_svar x) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (patt_free_svar x) (S dbi)
H: X ∉ free_svars (patt_free_svar x)

eval ρ (patt_free_svar x) = eval (update_svar_val X (eval ρ phi2) ρ) (patt_free_svar x)^[svar:dbi↦patt_free_svar X]
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
x: svar
phi2: Pattern
Hsz: size (patt_free_svar x) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (patt_free_svar x) (S dbi)
H: X ∉ free_svars (patt_free_svar x)

eval ρ (patt_free_svar x) = eval (update_svar_val X (eval ρ phi2) ρ) (patt_free_svar x)
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
x: svar
phi2: Pattern
Hsz: size (patt_free_svar x) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (patt_free_svar x) (S dbi)
H: X ∉ free_svars (patt_free_svar x)

svar_valuation ρ x = svar_valuation (update_svar_val X (eval ρ phi2) ρ) x
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
x: svar
phi2: Pattern
Hsz: size (patt_free_svar x) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (patt_free_svar x) (S dbi)
H: X ∉ free_svars (patt_free_svar x)

svar_valuation ρ x = svar_valuation {| evar_valuation := evar_valuation ρ; svar_valuation := λ sv' : svar, if decide (X = sv') then eval ρ phi2 else svar_valuation ρ sv' |} x
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
x: svar
phi2: Pattern
Hsz: size (patt_free_svar x) ≤ S sz
ρₑ: evar → M
ρₛ: svar → propset M
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (patt_free_svar x) (S dbi)
H: X ∉ free_svars (patt_free_svar x)

svar_valuation {| evar_valuation := ρₑ; svar_valuation := ρₛ |} x = svar_valuation {| evar_valuation := evar_valuation {| evar_valuation := ρₑ; svar_valuation := ρₛ |}; svar_valuation := λ sv' : svar, if decide (X = sv') then eval {| evar_valuation := ρₑ; svar_valuation := ρₛ |} phi2 else svar_valuation {| evar_valuation := ρₑ; svar_valuation := ρₛ |} sv' |} x
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
x: svar
phi2: Pattern
Hsz: size (patt_free_svar x) ≤ S sz
ρₑ: evar → M
ρₛ: svar → propset M
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (patt_free_svar x) (S dbi)
H: X ∉ free_svars (patt_free_svar x)

ρₛ x = (if decide (X = x) then eval {| evar_valuation := ρₑ; svar_valuation := ρₛ |} phi2 else ρₛ x)
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
x: svar
phi2: Pattern
Hsz: size (patt_free_svar x) ≤ S sz
ρₑ: evar → M
ρₛ: svar → propset M
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (patt_free_svar x) (S dbi)
H: X ∉ free_svars (patt_free_svar x)
e: X = x

ρₛ x = eval {| evar_valuation := ρₑ; svar_valuation := ρₛ |} phi2
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
x: svar
phi2: Pattern
Hsz: size (patt_free_svar x) ≤ S sz
ρₑ: evar → M
ρₛ: svar → propset M
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (patt_free_svar x) (S dbi)
H: X ∉ free_svars (patt_free_svar x)
n: X ≠ x
ρₛ x = ρₛ x
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
x: svar
phi2: Pattern
Hsz: size (patt_free_svar x) ≤ S sz
ρₑ: evar → M
ρₛ: svar → propset M
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (patt_free_svar x) (S dbi)
H: X ∉ free_svars (patt_free_svar x)
e: X = x

ρₛ x = eval {| evar_valuation := ρₑ; svar_valuation := ρₛ |} phi2
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
x: svar
phi2: Pattern
Hsz: size (patt_free_svar x) ≤ S sz
ρₑ: evar → M
ρₛ: svar → propset M
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (patt_free_svar x) (S dbi)
H: X ∉ {[x]}
e: X = x

ρₛ x = eval {| evar_valuation := ρₑ; svar_valuation := ρₛ |} phi2
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
x: svar
phi2: Pattern
Hsz: size (patt_free_svar x) ≤ S sz
ρₑ: evar → M
ρₛ: svar → propset M
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (patt_free_svar x) (S dbi)
H: X ∉ {[x]}
e: X = x

ρₛ x = eval {| evar_valuation := ρₑ; svar_valuation := ρₛ |} phi2
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
x: svar
phi2: Pattern
Hsz: size (patt_free_svar x) ≤ S sz
ρₑ: evar → M
ρₛ: svar → propset M
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (patt_free_svar x) (S dbi)
H: X ∈ {[x]} → False
e: X = x

ρₛ x = eval {| evar_valuation := ρₑ; svar_valuation := ρₛ |} phi2
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
x: svar
phi2: Pattern
Hsz: size (patt_free_svar x) ≤ S sz
ρₑ: evar → M
ρₛ: svar → propset M
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (patt_free_svar x) (S dbi)
H: X ∈ {[x]} → False
e: X = x

False
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
x: svar
phi2: Pattern
Hsz: size (patt_free_svar x) ≤ S sz
ρₑ: evar → M
ρₛ: svar → propset M
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (patt_free_svar x) (S dbi)
H: X ∈ {[x]} → False
e: X = x

X ∈ {[x]}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
x: svar
phi2: Pattern
Hsz: size (patt_free_svar x) ≤ S sz
ρₑ: evar → M
ρₛ: svar → propset M
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (patt_free_svar x) (S dbi)
H: X ∈ {[x]} → False
e: X = x

X = x
auto.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
x: svar
phi2: Pattern
Hsz: size (patt_free_svar x) ≤ S sz
ρₑ: evar → M
ρₛ: svar → propset M
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (patt_free_svar x) (S dbi)
H: X ∉ free_svars (patt_free_svar x)
n: X ≠ x

ρₛ x = ρₛ x
auto.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi, n: db_index
phi2: Pattern
Hsz: size (patt_bound_evar n) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (patt_bound_evar n) (S dbi)
H: X ∉ free_svars (patt_bound_evar n)

eval ρ (patt_bound_evar n) = eval (update_svar_val X (eval ρ phi2) ρ) (patt_bound_evar n)^{svar:dbi↦X}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi, n: db_index
phi2: Pattern
Hsz: size (patt_bound_evar n) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (patt_bound_evar n) (S dbi)
H: X ∉ free_svars (patt_bound_evar n)

∅ = ∅
reflexivity.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi, n: db_index
phi2: Pattern
Hsz: size (patt_bound_svar n) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (patt_bound_svar n) (S dbi)
H: X ∉ free_svars (patt_bound_svar n)

eval ρ match compare_nat n dbi with | Nat_less _ _ _ => patt_bound_svar n | Nat_equal _ _ _ => phi2 | Nat_greater _ _ _ => patt_bound_svar (Nat.pred n) end = eval (update_svar_val X (eval ρ phi2) ρ) (patt_bound_svar n)^{svar:dbi↦X}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi, n: db_index
phi2: Pattern
Hsz: size (patt_bound_svar n) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (patt_bound_svar n) (S dbi)
H: X ∉ free_svars (patt_bound_svar n)

eval ρ match compare_nat n dbi with | Nat_less _ _ _ => patt_bound_svar n | Nat_equal _ _ _ => phi2 | Nat_greater _ _ _ => patt_bound_svar (Nat.pred n) end = eval (update_svar_val X (eval ρ phi2) ρ) (patt_bound_svar n)^[svar:dbi↦patt_free_svar X]
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi, n: db_index
phi2: Pattern
Hsz: size (patt_bound_svar n) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (patt_bound_svar n) (S dbi)
H: X ∉ free_svars (patt_bound_svar n)

eval ρ match compare_nat n dbi with | Nat_less _ _ _ => patt_bound_svar n | Nat_equal _ _ _ => phi2 | Nat_greater _ _ _ => patt_bound_svar (Nat.pred n) end = eval (update_svar_val X (eval ρ phi2) ρ) match compare_nat n dbi with | Nat_less _ _ _ => patt_bound_svar n | Nat_equal _ _ _ => patt_free_svar X | Nat_greater _ _ _ => patt_bound_svar (Nat.pred n) end
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi, n: db_index
phi2: Pattern
Hsz: size (patt_bound_svar n) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (patt_bound_svar n) (S dbi)
H: X ∉ free_svars (patt_bound_svar n)
l: n < dbi
H0: compare_nat n dbi = Nat_less n dbi l

eval ρ (patt_bound_svar n) = eval (update_svar_val X (eval ρ phi2) ρ) (patt_bound_svar n)
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi, n: db_index
phi2: Pattern
Hsz: size (patt_bound_svar n) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (patt_bound_svar n) (S dbi)
H: X ∉ free_svars (patt_bound_svar n)
e: n = dbi
H0: compare_nat n dbi = Nat_equal n dbi e
eval ρ phi2 = eval (update_svar_val X (eval ρ phi2) ρ) (patt_free_svar X)
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi, n: db_index
phi2: Pattern
Hsz: size (patt_bound_svar n) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (patt_bound_svar n) (S dbi)
H: X ∉ free_svars (patt_bound_svar n)
g: n > dbi
H0: compare_nat n dbi = Nat_greater n dbi g
eval ρ (patt_bound_svar (Nat.pred n)) = eval (update_svar_val X (eval ρ phi2) ρ) (patt_bound_svar (Nat.pred n))
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi, n: db_index
phi2: Pattern
Hsz: size (patt_bound_svar n) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (patt_bound_svar n) (S dbi)
H: X ∉ free_svars (patt_bound_svar n)
l: n < dbi
H0: compare_nat n dbi = Nat_less n dbi l

eval ρ (patt_bound_svar n) = eval (update_svar_val X (eval ρ phi2) ρ) (patt_bound_svar n)
repeat rewrite -> eval_bound_evar_simpl; auto.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi, n: db_index
phi2: Pattern
Hsz: size (patt_bound_svar n) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (patt_bound_svar n) (S dbi)
H: X ∉ free_svars (patt_bound_svar n)
e: n = dbi
H0: compare_nat n dbi = Nat_equal n dbi e

eval ρ phi2 = eval (update_svar_val X (eval ρ phi2) ρ) (patt_free_svar X)
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi, n: db_index
phi2: Pattern
Hsz: size (patt_bound_svar n) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (patt_bound_svar n) (S dbi)
H: X ∉ free_svars (patt_bound_svar n)
e: n = dbi
H0: compare_nat n dbi = Nat_equal n dbi e

eval ρ phi2 = svar_valuation (update_svar_val X (eval ρ phi2) ρ) X
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi, n: db_index
phi2: Pattern
Hsz: size (patt_bound_svar n) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (patt_bound_svar n) (S dbi)
H: X ∉ free_svars (patt_bound_svar n)
e: n = dbi
H0: compare_nat n dbi = Nat_equal n dbi e

eval ρ phi2 = svar_valuation {| evar_valuation := evar_valuation ρ; svar_valuation := λ sv' : svar, if decide (X = sv') then eval ρ phi2 else svar_valuation ρ sv' |} X
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi, n: db_index
phi2: Pattern
Hsz: size (patt_bound_svar n) ≤ S sz
ρₑ: evar → M
ρₛ: svar → propset M
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (patt_bound_svar n) (S dbi)
H: X ∉ free_svars (patt_bound_svar n)
e: n = dbi
H0: compare_nat n dbi = Nat_equal n dbi e

eval {| evar_valuation := ρₑ; svar_valuation := ρₛ |} phi2 = svar_valuation {| evar_valuation := evar_valuation {| evar_valuation := ρₑ; svar_valuation := ρₛ |}; svar_valuation := λ sv' : svar, if decide (X = sv') then eval {| evar_valuation := ρₑ; svar_valuation := ρₛ |} phi2 else svar_valuation {| evar_valuation := ρₑ; svar_valuation := ρₛ |} sv' |} X
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi, n: db_index
phi2: Pattern
Hsz: size (patt_bound_svar n) ≤ S sz
ρₑ: evar → M
ρₛ: svar → propset M
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (patt_bound_svar n) (S dbi)
H: X ∉ free_svars (patt_bound_svar n)
e: n = dbi
H0: compare_nat n dbi = Nat_equal n dbi e

eval {| evar_valuation := ρₑ; svar_valuation := ρₛ |} phi2 = (if decide (X = X) then eval {| evar_valuation := ρₑ; svar_valuation := ρₛ |} phi2 else ρₛ X)
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi, n: db_index
phi2: Pattern
Hsz: size (patt_bound_svar n) ≤ S sz
ρₑ: evar → M
ρₛ: svar → propset M
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (patt_bound_svar n) (S dbi)
H: X ∉ free_svars (patt_bound_svar n)
e: n = dbi
H0: compare_nat n dbi = Nat_equal n dbi e

eval {| evar_valuation := ρₑ; svar_valuation := ρₛ |} phi2 = eval {| evar_valuation := ρₑ; svar_valuation := ρₛ |} phi2
reflexivity.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi, n: db_index
phi2: Pattern
Hsz: size (patt_bound_svar n) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (patt_bound_svar n) (S dbi)
H: X ∉ free_svars (patt_bound_svar n)
g: n > dbi
H0: compare_nat n dbi = Nat_greater n dbi g

eval ρ (patt_bound_svar (Nat.pred n)) = eval (update_svar_val X (eval ρ phi2) ρ) (patt_bound_svar (Nat.pred n))
repeat rewrite -> eval_bound_svar_simpl; auto.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
sigma: symbols
phi2: Pattern
Hsz: size (patt_sym sigma) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (patt_sym sigma) (S dbi)
H: X ∉ free_svars (patt_sym sigma)

eval ρ (patt_sym sigma) = eval (update_svar_val X (eval ρ phi2) ρ) (patt_sym sigma)^{svar:dbi↦X}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
sigma: symbols
phi2: Pattern
Hsz: size (patt_sym sigma) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (patt_sym sigma) (S dbi)
H: X ∉ free_svars (patt_sym sigma)

eval ρ (patt_sym sigma) = eval (update_svar_val X (eval ρ phi2) ρ) (patt_sym sigma)^{svar:dbi↦X}
repeat rewrite -> eval_sym_simpl; auto. (* HERE the duplication ends *)
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1_1, phi1_2, phi2: Pattern
Hsz: size (phi1_1 $ phi1_2) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (phi1_1 $ phi1_2) (S dbi)
H: X ∉ free_svars (phi1_1 $ phi1_2)

eval ρ (phi1_1^[svar:dbi↦phi2] $ phi1_2^[svar:dbi↦phi2]) = eval (update_svar_val X (eval ρ phi2) ρ) (phi1_1 $ phi1_2)^{svar:dbi↦X}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1_1, phi1_2, phi2: Pattern
Hsz: size (phi1_1 $ phi1_2) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (phi1_1 $ phi1_2) (S dbi)
H: X ∉ free_svars (phi1_1 $ phi1_2)

eval ρ (phi1_1^[svar:dbi↦phi2] $ phi1_2^[svar:dbi↦phi2]) = eval (update_svar_val X (eval ρ phi2) ρ) (phi1_1^{svar:dbi↦X} $ phi1_2^{svar:dbi↦X})
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1_1, phi1_2, phi2: Pattern
Hsz: size (phi1_1 $ phi1_2) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (phi1_1 $ phi1_2) (S dbi)
H: X ∉ free_svars phi1_1 ∪ free_svars phi1_2

eval ρ (phi1_1^[svar:dbi↦phi2] $ phi1_2^[svar:dbi↦phi2]) = eval (update_svar_val X (eval ρ phi2) ρ) (phi1_1^{svar:dbi↦X} $ phi1_2^{svar:dbi↦X})
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1_1, phi1_2, phi2: Pattern
Hsz: size (phi1_1 $ phi1_2) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (phi1_1 $ phi1_2) (S dbi)
H: (X ∉ free_svars phi1_1) ∧ X ∉ free_svars phi1_2

eval ρ (phi1_1^[svar:dbi↦phi2] $ phi1_2^[svar:dbi↦phi2]) = eval (update_svar_val X (eval ρ phi2) ρ) (phi1_1^{svar:dbi↦X} $ phi1_2^{svar:dbi↦X})
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1_1, phi1_2, phi2: Pattern
Hsz: size (phi1_1 $ phi1_2) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (phi1_1 $ phi1_2) (S dbi)
H: X ∉ free_svars phi1_1
H0: X ∉ free_svars phi1_2

eval ρ (phi1_1^[svar:dbi↦phi2] $ phi1_2^[svar:dbi↦phi2]) = eval (update_svar_val X (eval ρ phi2) ρ) (phi1_1^{svar:dbi↦X} $ phi1_2^{svar:dbi↦X})
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1_1, phi1_2, phi2: Pattern
Hsz: size (phi1_1 $ phi1_2) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (phi1_1 $ phi1_2) (S dbi)
H: X ∉ free_svars phi1_1
H0: X ∉ free_svars phi1_2

app_ext (eval ρ phi1_1^[svar:dbi↦phi2]) (eval ρ phi1_2^[svar:dbi↦phi2]) = app_ext (eval (update_svar_val X (eval ρ phi2) ρ) phi1_1^{svar:dbi↦X}) (eval (update_svar_val X (eval ρ phi2) ρ) phi1_2^{svar:dbi↦X})
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1_1, phi1_2, phi2: Pattern
Hsz: S (size phi1_1 + size phi1_2) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (phi1_1 $ phi1_2) (S dbi)
H: X ∉ free_svars phi1_1
H0: X ∉ free_svars phi1_2

app_ext (eval ρ phi1_1^[svar:dbi↦phi2]) (eval ρ phi1_2^[svar:dbi↦phi2]) = app_ext (eval (update_svar_val X (eval ρ phi2) ρ) phi1_1^{svar:dbi↦X}) (eval (update_svar_val X (eval ρ phi2) ρ) phi1_2^{svar:dbi↦X})
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1_1, phi1_2, phi2: Pattern
Hsz: S (size phi1_1 + size phi1_2) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (phi1_1 $ phi1_2) (S dbi)
H: X ∉ free_svars phi1_1
H0: X ∉ free_svars phi1_2

app_ext (eval ρ phi1_1^[svar:dbi↦phi2]) (eval ρ phi1_2^[svar:dbi↦phi2]) = app_ext (eval ρ phi1_1^[svar:dbi↦phi2]) (eval ρ phi1_2^[svar:dbi↦phi2])
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1_1, phi1_2, phi2: Pattern
Hsz: S (size phi1_1 + size phi1_2) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (phi1_1 $ phi1_2) (S dbi)
H: X ∉ free_svars phi1_1
H0: X ∉ free_svars phi1_2
size phi1_2 ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1_1, phi1_2, phi2: Pattern
Hsz: S (size phi1_1 + size phi1_2) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (phi1_1 $ phi1_2) (S dbi)
H: X ∉ free_svars phi1_1
H0: X ∉ free_svars phi1_2
well_formed_closed phi2
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1_1, phi1_2, phi2: Pattern
Hsz: S (size phi1_1 + size phi1_2) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (phi1_1 $ phi1_2) (S dbi)
H: X ∉ free_svars phi1_1
H0: X ∉ free_svars phi1_2
well_formed_closed_mu_aux phi1_2 (S dbi)
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1_1, phi1_2, phi2: Pattern
Hsz: S (size phi1_1 + size phi1_2) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (phi1_1 $ phi1_2) (S dbi)
H: X ∉ free_svars phi1_1
H0: X ∉ free_svars phi1_2
X ∉ free_svars phi1_2
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1_1, phi1_2, phi2: Pattern
Hsz: S (size phi1_1 + size phi1_2) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (phi1_1 $ phi1_2) (S dbi)
H: X ∉ free_svars phi1_1
H0: X ∉ free_svars phi1_2
size phi1_1 ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1_1, phi1_2, phi2: Pattern
Hsz: S (size phi1_1 + size phi1_2) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (phi1_1 $ phi1_2) (S dbi)
H: X ∉ free_svars phi1_1
H0: X ∉ free_svars phi1_2
well_formed_closed phi2
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1_1, phi1_2, phi2: Pattern
Hsz: S (size phi1_1 + size phi1_2) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (phi1_1 $ phi1_2) (S dbi)
H: X ∉ free_svars phi1_1
H0: X ∉ free_svars phi1_2
well_formed_closed_mu_aux phi1_1 (S dbi)
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1_1, phi1_2, phi2: Pattern
Hsz: S (size phi1_1 + size phi1_2) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (phi1_1 $ phi1_2) (S dbi)
H: X ∉ free_svars phi1_1
H0: X ∉ free_svars phi1_2
X ∉ free_svars phi1_1
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1_1, phi1_2, phi2: Pattern
Hsz: S (size phi1_1 + size phi1_2) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (phi1_1 $ phi1_2) (S dbi)
H: X ∉ free_svars phi1_1
H0: X ∉ free_svars phi1_2

app_ext (eval ρ phi1_1^[svar:dbi↦phi2]) (eval ρ phi1_2^[svar:dbi↦phi2]) = app_ext (eval ρ phi1_1^[svar:dbi↦phi2]) (eval ρ phi1_2^[svar:dbi↦phi2])
reflexivity.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1_1, phi1_2, phi2: Pattern
Hsz: S (size phi1_1 + size phi1_2) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (phi1_1 $ phi1_2) (S dbi)
H: X ∉ free_svars phi1_1
H0: X ∉ free_svars phi1_2

size phi1_2 ≤ sz
lia.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1_1, phi1_2, phi2: Pattern
Hsz: S (size phi1_1 + size phi1_2) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (phi1_1 $ phi1_2) (S dbi)
H: X ∉ free_svars phi1_1
H0: X ∉ free_svars phi1_2

well_formed_closed phi2
assumption.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1_1, phi1_2, phi2: Pattern
Hsz: S (size phi1_1 + size phi1_2) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (phi1_1 $ phi1_2) (S dbi)
H: X ∉ free_svars phi1_1
H0: X ∉ free_svars phi1_2

well_formed_closed_mu_aux phi1_2 (S dbi)
now apply andb_true_iff in Hwfphi1.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1_1, phi1_2, phi2: Pattern
Hsz: S (size phi1_1 + size phi1_2) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (phi1_1 $ phi1_2) (S dbi)
H: X ∉ free_svars phi1_1
H0: X ∉ free_svars phi1_2

X ∉ free_svars phi1_2
auto.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1_1, phi1_2, phi2: Pattern
Hsz: S (size phi1_1 + size phi1_2) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (phi1_1 $ phi1_2) (S dbi)
H: X ∉ free_svars phi1_1
H0: X ∉ free_svars phi1_2

size phi1_1 ≤ sz
lia.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1_1, phi1_2, phi2: Pattern
Hsz: S (size phi1_1 + size phi1_2) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (phi1_1 $ phi1_2) (S dbi)
H: X ∉ free_svars phi1_1
H0: X ∉ free_svars phi1_2

well_formed_closed phi2
assumption.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1_1, phi1_2, phi2: Pattern
Hsz: S (size phi1_1 + size phi1_2) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (phi1_1 $ phi1_2) (S dbi)
H: X ∉ free_svars phi1_1
H0: X ∉ free_svars phi1_2

well_formed_closed_mu_aux phi1_1 (S dbi)
now apply andb_true_iff in Hwfphi1.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1_1, phi1_2, phi2: Pattern
Hsz: S (size phi1_1 + size phi1_2) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (phi1_1 $ phi1_2) (S dbi)
H: X ∉ free_svars phi1_1
H0: X ∉ free_svars phi1_2

X ∉ free_svars phi1_1
auto.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi2: Pattern
Hsz: size ⊥ ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux ⊥ (S dbi)
H: X ∉ free_svars ⊥

eval ρ ⊥ = eval (update_svar_val X (eval ρ phi2) ρ) ⊥^{svar:dbi↦X}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi2: Pattern
Hsz: size ⊥ ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux ⊥ (S dbi)
H: X ∉ free_svars ⊥

eval ρ ⊥ = eval (update_svar_val X (eval ρ phi2) ρ) ⊥^{svar:dbi↦X}
repeat rewrite eval_bott_simpl; auto.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1_1, phi1_2, phi2: Pattern
Hsz: size (phi1_1 ---> phi1_2) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (phi1_1 ---> phi1_2) (S dbi)
H: X ∉ free_svars (phi1_1 ---> phi1_2)

eval ρ (phi1_1^[svar:dbi↦phi2] ---> phi1_2^[svar:dbi↦phi2]) = eval (update_svar_val X (eval ρ phi2) ρ) (phi1_1 ---> phi1_2)^{svar:dbi↦X}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1_1, phi1_2, phi2: Pattern
Hsz: size (phi1_1 ---> phi1_2) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (phi1_1 ---> phi1_2) (S dbi)
H: X ∉ free_svars (phi1_1 ---> phi1_2)

eval ρ (phi1_1^[svar:dbi↦phi2] ---> phi1_2^[svar:dbi↦phi2]) = eval (update_svar_val X (eval ρ phi2) ρ) (phi1_1^{svar:dbi↦X} ---> phi1_2^{svar:dbi↦X})
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1_1, phi1_2, phi2: Pattern
Hsz: S (size phi1_1 + size phi1_2) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (phi1_1 ---> phi1_2) (S dbi)
H: X ∉ free_svars (phi1_1 ---> phi1_2)

eval ρ (phi1_1^[svar:dbi↦phi2] ---> phi1_2^[svar:dbi↦phi2]) = eval (update_svar_val X (eval ρ phi2) ρ) (phi1_1^{svar:dbi↦X} ---> phi1_2^{svar:dbi↦X})
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1_1, phi1_2, phi2: Pattern
Hsz: S (size phi1_1 + size phi1_2) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (phi1_1 ---> phi1_2) (S dbi)
H: X ∉ free_svars phi1_1 ∪ free_svars phi1_2

eval ρ (phi1_1^[svar:dbi↦phi2] ---> phi1_2^[svar:dbi↦phi2]) = eval (update_svar_val X (eval ρ phi2) ρ) (phi1_1^{svar:dbi↦X} ---> phi1_2^{svar:dbi↦X})
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1_1, phi1_2, phi2: Pattern
Hsz: S (size phi1_1 + size phi1_2) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (phi1_1 ---> phi1_2) (S dbi)
H: X ∉ free_svars phi1_1 ∪ free_svars phi1_2

eval ρ (phi1_1^[svar:dbi↦phi2] ---> phi1_2^[svar:dbi↦phi2]) = eval (update_svar_val X (eval ρ phi2) ρ) (phi1_1^{svar:dbi↦X} ---> phi1_2^{svar:dbi↦X})
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1_1, phi1_2, phi2: Pattern
Hsz: S (size phi1_1 + size phi1_2) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (phi1_1 ---> phi1_2) (S dbi)
H: (X ∉ free_svars phi1_1) ∧ X ∉ free_svars phi1_2

eval ρ (phi1_1^[svar:dbi↦phi2] ---> phi1_2^[svar:dbi↦phi2]) = eval (update_svar_val X (eval ρ phi2) ρ) (phi1_1^{svar:dbi↦X} ---> phi1_2^{svar:dbi↦X})
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1_1, phi1_2, phi2: Pattern
Hsz: S (size phi1_1 + size phi1_2) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (phi1_1 ---> phi1_2) (S dbi)
H: X ∉ free_svars phi1_1
H0: X ∉ free_svars phi1_2

eval ρ (phi1_1^[svar:dbi↦phi2] ---> phi1_2^[svar:dbi↦phi2]) = eval (update_svar_val X (eval ρ phi2) ρ) (phi1_1^{svar:dbi↦X} ---> phi1_2^{svar:dbi↦X})
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1_1, phi1_2, phi2: Pattern
Hsz: S (size phi1_1 + size phi1_2) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (phi1_1 ---> phi1_2) (S dbi)
H: X ∉ free_svars phi1_1
H0: X ∉ free_svars phi1_2

⊤ ∖ eval ρ phi1_1^[svar:dbi↦phi2] ∪ eval ρ phi1_2^[svar:dbi↦phi2] = ⊤ ∖ eval (update_svar_val X (eval ρ phi2) ρ) phi1_1^{svar:dbi↦X} ∪ eval (update_svar_val X (eval ρ phi2) ρ) phi1_2^{svar:dbi↦X}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1_1, phi1_2, phi2: Pattern
Hsz: S (size phi1_1 + size phi1_2) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (phi1_1 ---> phi1_2) (S dbi)
H: X ∉ free_svars phi1_1
H0: X ∉ free_svars phi1_2

⊤ ∖ eval ρ phi1_1^[svar:dbi↦phi2] ∪ eval ρ phi1_2^[svar:dbi↦phi2] = ⊤ ∖ eval ρ phi1_1^[svar:dbi↦phi2] ∪ eval ρ phi1_2^[svar:dbi↦phi2]
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1_1, phi1_2, phi2: Pattern
Hsz: S (size phi1_1 + size phi1_2) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (phi1_1 ---> phi1_2) (S dbi)
H: X ∉ free_svars phi1_1
H0: X ∉ free_svars phi1_2
size phi1_2 ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1_1, phi1_2, phi2: Pattern
Hsz: S (size phi1_1 + size phi1_2) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (phi1_1 ---> phi1_2) (S dbi)
H: X ∉ free_svars phi1_1
H0: X ∉ free_svars phi1_2
well_formed_closed phi2
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1_1, phi1_2, phi2: Pattern
Hsz: S (size phi1_1 + size phi1_2) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (phi1_1 ---> phi1_2) (S dbi)
H: X ∉ free_svars phi1_1
H0: X ∉ free_svars phi1_2
well_formed_closed_mu_aux phi1_2 (S dbi)
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1_1, phi1_2, phi2: Pattern
Hsz: S (size phi1_1 + size phi1_2) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (phi1_1 ---> phi1_2) (S dbi)
H: X ∉ free_svars phi1_1
H0: X ∉ free_svars phi1_2
X ∉ free_svars phi1_2
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1_1, phi1_2, phi2: Pattern
Hsz: S (size phi1_1 + size phi1_2) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (phi1_1 ---> phi1_2) (S dbi)
H: X ∉ free_svars phi1_1
H0: X ∉ free_svars phi1_2
size phi1_1 ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1_1, phi1_2, phi2: Pattern
Hsz: S (size phi1_1 + size phi1_2) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (phi1_1 ---> phi1_2) (S dbi)
H: X ∉ free_svars phi1_1
H0: X ∉ free_svars phi1_2
well_formed_closed phi2
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1_1, phi1_2, phi2: Pattern
Hsz: S (size phi1_1 + size phi1_2) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (phi1_1 ---> phi1_2) (S dbi)
H: X ∉ free_svars phi1_1
H0: X ∉ free_svars phi1_2
well_formed_closed_mu_aux phi1_1 (S dbi)
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1_1, phi1_2, phi2: Pattern
Hsz: S (size phi1_1 + size phi1_2) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (phi1_1 ---> phi1_2) (S dbi)
H: X ∉ free_svars phi1_1
H0: X ∉ free_svars phi1_2
X ∉ free_svars phi1_1
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1_1, phi1_2, phi2: Pattern
Hsz: S (size phi1_1 + size phi1_2) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (phi1_1 ---> phi1_2) (S dbi)
H: X ∉ free_svars phi1_1
H0: X ∉ free_svars phi1_2

⊤ ∖ eval ρ phi1_1^[svar:dbi↦phi2] ∪ eval ρ phi1_2^[svar:dbi↦phi2] = ⊤ ∖ eval ρ phi1_1^[svar:dbi↦phi2] ∪ eval ρ phi1_2^[svar:dbi↦phi2]
reflexivity.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1_1, phi1_2, phi2: Pattern
Hsz: S (size phi1_1 + size phi1_2) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (phi1_1 ---> phi1_2) (S dbi)
H: X ∉ free_svars phi1_1
H0: X ∉ free_svars phi1_2

size phi1_2 ≤ sz
lia.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1_1, phi1_2, phi2: Pattern
Hsz: S (size phi1_1 + size phi1_2) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (phi1_1 ---> phi1_2) (S dbi)
H: X ∉ free_svars phi1_1
H0: X ∉ free_svars phi1_2

well_formed_closed phi2
assumption.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1_1, phi1_2, phi2: Pattern
Hsz: S (size phi1_1 + size phi1_2) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (phi1_1 ---> phi1_2) (S dbi)
H: X ∉ free_svars phi1_1
H0: X ∉ free_svars phi1_2

well_formed_closed_mu_aux phi1_2 (S dbi)
now apply andb_true_iff in Hwfphi1.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1_1, phi1_2, phi2: Pattern
Hsz: S (size phi1_1 + size phi1_2) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (phi1_1 ---> phi1_2) (S dbi)
H: X ∉ free_svars phi1_1
H0: X ∉ free_svars phi1_2

X ∉ free_svars phi1_2
auto.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1_1, phi1_2, phi2: Pattern
Hsz: S (size phi1_1 + size phi1_2) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (phi1_1 ---> phi1_2) (S dbi)
H: X ∉ free_svars phi1_1
H0: X ∉ free_svars phi1_2

size phi1_1 ≤ sz
lia.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1_1, phi1_2, phi2: Pattern
Hsz: S (size phi1_1 + size phi1_2) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (phi1_1 ---> phi1_2) (S dbi)
H: X ∉ free_svars phi1_1
H0: X ∉ free_svars phi1_2

well_formed_closed phi2
assumption.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1_1, phi1_2, phi2: Pattern
Hsz: S (size phi1_1 + size phi1_2) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (phi1_1 ---> phi1_2) (S dbi)
H: X ∉ free_svars phi1_1
H0: X ∉ free_svars phi1_2

well_formed_closed_mu_aux phi1_1 (S dbi)
now apply andb_true_iff in Hwfphi1.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1_1, phi1_2, phi2: Pattern
Hsz: S (size phi1_1 + size phi1_2) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (phi1_1 ---> phi1_2) (S dbi)
H: X ∉ free_svars phi1_1
H0: X ∉ free_svars phi1_2

X ∉ free_svars phi1_1
auto.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (ex , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (ex , phi1) (S dbi)
H: X ∉ free_svars (ex , phi1)

eval ρ (ex , phi1^[svar:dbi↦phi2]) = eval (update_svar_val X (eval ρ phi2) ρ) (ex , phi1)^{svar:dbi↦X}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (ex , phi1) (S dbi)
H: X ∉ free_svars (ex , phi1)

eval ρ (ex , phi1^[svar:dbi↦phi2]) = eval (update_svar_val X (eval ρ phi2) ρ) (ex , phi1)^{svar:dbi↦X}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (ex , phi1) (S dbi)
H: X ∉ free_svars phi1

eval ρ (ex , phi1^[svar:dbi↦phi2]) = eval (update_svar_val X (eval ρ phi2) ρ) (ex , phi1)^{svar:dbi↦X}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (ex , phi1) (S dbi)
H: X ∉ free_svars phi1

eval ρ (ex , phi1^[svar:dbi↦phi2]) = eval (update_svar_val X (eval ρ phi2) ρ) (ex , phi1)^[svar:dbi↦patt_free_svar X]
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (ex , phi1) (S dbi)
H: X ∉ free_svars phi1

eval ρ (ex , phi1^[svar:dbi↦phi2]) = eval (update_svar_val X (eval ρ phi2) ρ) (ex , phi1^[svar:dbi↦patt_free_svar X])
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (ex , phi1) (S dbi)
H: X ∉ free_svars phi1

(let x := fresh_evar phi1^[svar:dbi↦phi2] in propset_fa_union (λ e : M, let ρ' := update_evar_val x e ρ in eval ρ' phi1^[svar:dbi↦phi2]^{evar:0↦x})) = (let x := fresh_evar phi1^[svar:dbi↦patt_free_svar X] in propset_fa_union (λ e : M, let ρ' := update_evar_val x e (update_svar_val X (eval ρ phi2) ρ) in eval ρ' phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦x}))
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (ex , phi1) (S dbi)
H: X ∉ free_svars phi1

propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar phi1^[svar:dbi↦phi2]) e ρ) phi1^[svar:dbi↦phi2]^{evar:0↦fresh_evar phi1^[svar:dbi↦phi2]}) = propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar phi1^[svar:dbi↦patt_free_svar X]) e (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦fresh_evar phi1^[svar:dbi↦ patt_free_svar X]})
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (ex , phi1) (S dbi)
H: X ∉ free_svars phi1

c : M, eval (update_evar_val (fresh_evar phi1^[svar:dbi↦phi2]) c ρ) phi1^[svar:dbi↦phi2]^{evar:0↦fresh_evar phi1^[svar:dbi↦phi2]} = eval (update_evar_val (fresh_evar phi1^[svar:dbi↦patt_free_svar X]) c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦fresh_evar phi1^[svar:dbi↦ patt_free_svar X]}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (ex , phi1) (S dbi)
H: X ∉ free_svars phi1
c: M

eval (update_evar_val (fresh_evar phi1^[svar:dbi↦phi2]) c ρ) phi1^[svar:dbi↦phi2]^{evar:0↦fresh_evar phi1^[svar:dbi↦phi2]} = eval (update_evar_val (fresh_evar phi1^[svar:dbi↦patt_free_svar X]) c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦fresh_evar phi1^[svar:dbi↦ patt_free_svar X]}
(* x = fresh_evar phi1' *) (* y = evar_fresh (elements (free_evars phi1') U (free_evars phi2)) *)
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (ex , phi1) (S dbi)
H: X ∉ free_svars phi1
c: M
phi1': Pattern
Heqphi1': phi1' = phi1^[svar:dbi↦patt_free_svar X]

eval (update_evar_val (fresh_evar phi1^[svar:dbi↦phi2]) c ρ) phi1^[svar:dbi↦phi2]^{evar:0↦fresh_evar phi1^[svar:dbi↦phi2]} = eval (update_evar_val (fresh_evar phi1') c (update_svar_val X (eval ρ phi2) ρ)) phi1'^{evar:0↦fresh_evar phi1'}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (ex , phi1) (S dbi)
H: X ∉ free_svars phi1
c: M
phi1': Pattern
Heqphi1': phi1' = phi1^[svar:dbi↦patt_free_svar X]
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1'

eval (update_evar_val (fresh_evar phi1^[svar:dbi↦phi2]) c ρ) phi1^[svar:dbi↦phi2]^{evar:0↦fresh_evar phi1^[svar:dbi↦phi2]} = eval (update_evar_val Xfr2' c (update_svar_val X (eval ρ phi2) ρ)) phi1'^{evar:0↦Xfr2'}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (ex , phi1) (S dbi)
H: X ∉ free_svars phi1
c: M
phi1': Pattern
Heqphi1': phi1' = phi1^[svar:dbi↦patt_free_svar X]
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1'
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi1' ∪ free_evars phi2))

eval (update_evar_val (fresh_evar phi1^[svar:dbi↦phi2]) c ρ) phi1^[svar:dbi↦phi2]^{evar:0↦fresh_evar phi1^[svar:dbi↦phi2]} = eval (update_evar_val Xfr2' c (update_svar_val X (eval ρ phi2) ρ)) phi1'^{evar:0↦Xfr2'}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (ex , phi1) (S dbi)
H: X ∉ free_svars phi1
c: M
phi1': Pattern
Heqphi1': phi1' = phi1^[svar:dbi↦patt_free_svar X]
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1'
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi1' ∪ free_evars phi2))
ρ2': Valuation
Heqρ2': ρ2' = update_svar_val X (eval ρ phi2) ρ

eval (update_evar_val (fresh_evar phi1^[svar:dbi↦phi2]) c ρ) phi1^[svar:dbi↦phi2]^{evar:0↦fresh_evar phi1^[svar:dbi↦phi2]} = eval (update_evar_val Xfr2' c ρ2') phi1'^{evar:0↦Xfr2'}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (ex , phi1) (S dbi)
H: X ∉ free_svars phi1
c: M
phi1': Pattern
Heqphi1': phi1' = phi1^[svar:dbi↦patt_free_svar X]
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1'
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi1' ∪ free_evars phi2))
ρ2': Valuation
Heqρ2': ρ2' = update_svar_val X (eval ρ phi2) ρ
Hfresh_subst: evar_is_fresh_in Xfr2' phi1' → evar_is_fresh_in Xu phi1' → eval (update_evar_val Xfr2' c ρ2') phi1'^{evar:0↦Xfr2'} = eval (update_evar_val Xu c ρ2') phi1'^{evar:0↦Xu}

eval (update_evar_val (fresh_evar phi1^[svar:dbi↦phi2]) c ρ) phi1^[svar:dbi↦phi2]^{evar:0↦fresh_evar phi1^[svar:dbi↦phi2]} = eval (update_evar_val Xfr2' c ρ2') phi1'^{evar:0↦Xfr2'}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (ex , phi1) (S dbi)
H: X ∉ free_svars phi1
c: M
phi1': Pattern
Heqphi1': phi1' = phi1^[svar:dbi↦patt_free_svar X]
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1'
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi1' ∪ free_evars phi2))
ρ2': Valuation
Heqρ2': ρ2' = update_svar_val X (eval ρ phi2) ρ
Hfresh_subst: evar_is_fresh_in Xfr2' phi1' → evar_is_fresh_in Xu phi1' → eval (update_evar_val Xfr2' c ρ2') phi1'^{evar:0↦Xfr2'} = eval (update_evar_val Xu c ρ2') phi1'^{evar:0↦Xu}

eval (update_evar_val (fresh_evar phi1^[svar:dbi↦phi2]) c ρ) phi1^[svar:dbi↦phi2]^{evar:0↦fresh_evar phi1^[svar:dbi↦phi2]} = eval (update_evar_val Xu c ρ2') phi1'^{evar:0↦Xu}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (ex , phi1) (S dbi)
H: X ∉ free_svars phi1
c: M
phi1': Pattern
Heqphi1': phi1' = phi1^[svar:dbi↦patt_free_svar X]
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1'
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi1' ∪ free_evars phi2))
ρ2': Valuation
Heqρ2': ρ2' = update_svar_val X (eval ρ phi2) ρ
Hfresh_subst: evar_is_fresh_in Xfr2' phi1' → evar_is_fresh_in Xu phi1' → eval (update_evar_val Xfr2' c ρ2') phi1'^{evar:0↦Xfr2'} = eval (update_evar_val Xu c ρ2') phi1'^{evar:0↦Xu}
evar_is_fresh_in Xfr2' phi1'
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (ex , phi1) (S dbi)
H: X ∉ free_svars phi1
c: M
phi1': Pattern
Heqphi1': phi1' = phi1^[svar:dbi↦patt_free_svar X]
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1'
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi1' ∪ free_evars phi2))
ρ2': Valuation
Heqρ2': ρ2' = update_svar_val X (eval ρ phi2) ρ
Hfresh_subst: evar_is_fresh_in Xfr2' phi1' → evar_is_fresh_in Xu phi1' → eval (update_evar_val Xfr2' c ρ2') phi1'^{evar:0↦Xfr2'} = eval (update_evar_val Xu c ρ2') phi1'^{evar:0↦Xu}
evar_is_fresh_in Xu phi1'
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (ex , phi1) (S dbi)
H: X ∉ free_svars phi1
c: M
phi1': Pattern
Heqphi1': phi1' = phi1^[svar:dbi↦patt_free_svar X]
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1'
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi1' ∪ free_evars phi2))
ρ2': Valuation
Heqρ2': ρ2' = update_svar_val X (eval ρ phi2) ρ
Hfresh_subst: evar_is_fresh_in Xfr2' phi1' → evar_is_fresh_in Xu phi1' → eval (update_evar_val Xfr2' c ρ2') phi1'^{evar:0↦Xfr2'} = eval (update_evar_val Xu c ρ2') phi1'^{evar:0↦Xu}

evar_is_fresh_in Xfr2' phi1'
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (ex , phi1) (S dbi)
H: X ∉ free_svars phi1
c: M
phi1': Pattern
Heqphi1': phi1' = phi1^[svar:dbi↦patt_free_svar X]
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi1' ∪ free_evars phi2))
ρ2': Valuation
Heqρ2': ρ2' = update_svar_val X (eval ρ phi2) ρ
Hfresh_subst: evar_is_fresh_in (fresh_evar phi1') phi1' → evar_is_fresh_in Xu phi1' → eval (update_evar_val (fresh_evar phi1') c ρ2') phi1'^{evar:0↦fresh_evar phi1'} = eval (update_evar_val Xu c ρ2') phi1'^{evar:0↦Xu}

evar_is_fresh_in (fresh_evar phi1') phi1'
apply set_evar_fresh_is_fresh.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (ex , phi1) (S dbi)
H: X ∉ free_svars phi1
c: M
phi1': Pattern
Heqphi1': phi1' = phi1^[svar:dbi↦patt_free_svar X]
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1'
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi1' ∪ free_evars phi2))
ρ2': Valuation
Heqρ2': ρ2' = update_svar_val X (eval ρ phi2) ρ
Hfresh_subst: evar_is_fresh_in Xfr2' phi1' → evar_is_fresh_in Xu phi1' → eval (update_evar_val Xfr2' c ρ2') phi1'^{evar:0↦Xfr2'} = eval (update_evar_val Xu c ρ2') phi1'^{evar:0↦Xu}

eval (update_evar_val (fresh_evar phi1^[svar:dbi↦phi2]) c ρ) phi1^[svar:dbi↦phi2]^{evar:0↦fresh_evar phi1^[svar:dbi↦phi2]} = eval (update_evar_val Xu c ρ2') phi1'^{evar:0↦Xu}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (ex , phi1) (S dbi)
H: X ∉ free_svars phi1
c: M
phi1': Pattern
Heqphi1': phi1' = phi1^[svar:dbi↦patt_free_svar X]
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1'
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi1' ∪ free_evars phi2))
ρ2': Valuation
Heqρ2': ρ2' = update_svar_val X (eval ρ phi2) ρ
Hfresh_subst: evar_is_fresh_in Xfr2' phi1' → evar_is_fresh_in Xu phi1' → eval (update_evar_val Xfr2' c ρ2') phi1'^{evar:0↦Xfr2'} = eval (update_evar_val Xu c ρ2') phi1'^{evar:0↦Xu}
evar_is_fresh_in Xu phi1'
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (ex , phi1) (S dbi)
H: X ∉ free_svars phi1
c: M
phi1': Pattern
Heqphi1': phi1' = phi1^[svar:dbi↦patt_free_svar X]
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1'
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi1' ∪ free_evars phi2))
ρ2': Valuation
Heqρ2': ρ2' = update_svar_val X (eval ρ phi2) ρ
Hfresh_subst: evar_is_fresh_in Xfr2' phi1' → evar_is_fresh_in Xu phi1' → eval (update_evar_val Xfr2' c ρ2') phi1'^{evar:0↦Xfr2'} = eval (update_evar_val Xu c ρ2') phi1'^{evar:0↦Xu}

evar_is_fresh_in Xu phi1'
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (ex , phi1) (S dbi)
H: X ∉ free_svars phi1
c: M
phi1': Pattern
Heqphi1': phi1' = phi1^[svar:dbi↦patt_free_svar X]
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1'
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi1' ∪ free_evars phi2))
ρ2': Valuation
Heqρ2': ρ2' = update_svar_val X (eval ρ phi2) ρ
Hfresh_subst: evar_is_fresh_in Xfr2' phi1' → evar_is_fresh_in Xu phi1' → eval (update_evar_val Xfr2' c ρ2') phi1'^{evar:0↦Xfr2'} = eval (update_evar_val Xu c ρ2') phi1'^{evar:0↦Xu}
Hfr: S : EVarSet, evar_fresh (elements S) ∉ S

evar_is_fresh_in Xu phi1'
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (ex , phi1) (S dbi)
H: X ∉ free_svars phi1
c: M
phi1': Pattern
Heqphi1': phi1' = phi1^[svar:dbi↦patt_free_svar X]
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1'
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi1' ∪ free_evars phi2))
ρ2': Valuation
Heqρ2': ρ2' = update_svar_val X (eval ρ phi2) ρ
Hfresh_subst: evar_is_fresh_in Xfr2' phi1' → evar_is_fresh_in Xu phi1' → eval (update_evar_val Xfr2' c ρ2') phi1'^{evar:0↦Xfr2'} = eval (update_evar_val Xu c ρ2') phi1'^{evar:0↦Xu}
Hfr: evar_fresh (elements (free_evars phi1' ∪ free_evars phi2)) ∉ free_evars phi1' ∪ free_evars phi2

evar_is_fresh_in Xu phi1'
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (ex , phi1) (S dbi)
H: X ∉ free_svars phi1
c: M
phi1': Pattern
Heqphi1': phi1' = phi1^[svar:dbi↦patt_free_svar X]
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1'
ρ2': Valuation
Heqρ2': ρ2' = update_svar_val X (eval ρ phi2) ρ
Hfresh_subst: evar_is_fresh_in Xfr2' phi1' → evar_is_fresh_in (evar_fresh (elements (free_evars phi1' ∪ free_evars phi2))) phi1' → eval (update_evar_val Xfr2' c ρ2') phi1'^{evar:0↦Xfr2'} = eval (update_evar_val (evar_fresh (elements (free_evars phi1' ∪ free_evars phi2))) c ρ2') phi1'^{evar:0↦evar_fresh (elements (free_evars phi1' ∪ free_evars phi2))}
Hfr: evar_fresh (elements (free_evars phi1' ∪ free_evars phi2)) ∉ free_evars phi1' ∪ free_evars phi2

evar_is_fresh_in (evar_fresh (elements (free_evars phi1' ∪ free_evars phi2))) phi1'
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (ex , phi1) (S dbi)
H: X ∉ free_svars phi1
c: M
phi1': Pattern
Heqphi1': phi1' = phi1^[svar:dbi↦patt_free_svar X]
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1'
ρ2': Valuation
Heqρ2': ρ2' = update_svar_val X (eval ρ phi2) ρ
Hfresh_subst: evar_is_fresh_in Xfr2' phi1' → evar_is_fresh_in (evar_fresh (elements (free_evars phi1' ∪ free_evars phi2))) phi1' → eval (update_evar_val Xfr2' c ρ2') phi1'^{evar:0↦Xfr2'} = eval (update_evar_val (evar_fresh (elements (free_evars phi1' ∪ free_evars phi2))) c ρ2') phi1'^{evar:0↦evar_fresh (elements (free_evars phi1' ∪ free_evars phi2))}
Hfr: (evar_fresh (elements (free_evars phi1' ∪ free_evars phi2)) ∉ free_evars phi1') ∧ evar_fresh (elements (free_evars phi1' ∪ free_evars phi2)) ∉ free_evars phi2

evar_is_fresh_in (evar_fresh (elements (free_evars phi1' ∪ free_evars phi2))) phi1'
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (ex , phi1) (S dbi)
H: X ∉ free_svars phi1
c: M
phi1': Pattern
Heqphi1': phi1' = phi1^[svar:dbi↦patt_free_svar X]
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1'
ρ2': Valuation
Heqρ2': ρ2' = update_svar_val X (eval ρ phi2) ρ
Hfresh_subst: evar_is_fresh_in Xfr2' phi1' → evar_is_fresh_in (evar_fresh (elements (free_evars phi1' ∪ free_evars phi2))) phi1' → eval (update_evar_val Xfr2' c ρ2') phi1'^{evar:0↦Xfr2'} = eval (update_evar_val (evar_fresh (elements (free_evars phi1' ∪ free_evars phi2))) c ρ2') phi1'^{evar:0↦evar_fresh (elements (free_evars phi1' ∪ free_evars phi2))}
Hfr: evar_fresh (elements (free_evars phi1' ∪ free_evars phi2)) ∉ free_evars phi1'

evar_is_fresh_in (evar_fresh (elements (free_evars phi1' ∪ free_evars phi2))) phi1'
auto.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (ex , phi1) (S dbi)
H: X ∉ free_svars phi1
c: M
phi1': Pattern
Heqphi1': phi1' = phi1^[svar:dbi↦patt_free_svar X]
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1'
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi1' ∪ free_evars phi2))
ρ2': Valuation
Heqρ2': ρ2' = update_svar_val X (eval ρ phi2) ρ
Hfresh_subst: evar_is_fresh_in Xfr2' phi1' → evar_is_fresh_in Xu phi1' → eval (update_evar_val Xfr2' c ρ2') phi1'^{evar:0↦Xfr2'} = eval (update_evar_val Xu c ρ2') phi1'^{evar:0↦Xu}

eval (update_evar_val (fresh_evar phi1^[svar:dbi↦phi2]) c ρ) phi1^[svar:dbi↦phi2]^{evar:0↦fresh_evar phi1^[svar:dbi↦phi2]} = eval (update_evar_val Xu c ρ2') phi1'^{evar:0↦Xu}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (ex , phi1) (S dbi)
H: X ∉ free_svars phi1
c: M
phi1': Pattern
Heqphi1': phi1' = phi1^[svar:dbi↦patt_free_svar X]
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1'
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi1' ∪ free_evars phi2))
ρ2': Valuation
Heqρ2': ρ2' = update_svar_val X (eval ρ phi2) ρ
Hfresh_subst: evar_is_fresh_in Xfr2' phi1' → evar_is_fresh_in Xu phi1' → eval (update_evar_val Xfr2' c ρ2') phi1'^{evar:0↦Xfr2'} = eval (update_evar_val Xu c ρ2') phi1'^{evar:0↦Xu}
ρe1': Valuation
Heqρe1': ρe1' = update_evar_val (fresh_evar phi1^[svar:dbi↦phi2]) c ρ

eval ρe1' phi1^[svar:dbi↦phi2]^{evar:0↦fresh_evar phi1^[svar:dbi↦phi2]} = eval (update_evar_val Xu c ρ2') phi1'^{evar:0↦Xu}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (ex , phi1) (S dbi)
H: X ∉ free_svars phi1
c: M
phi1': Pattern
Heqphi1': phi1' = phi1^[svar:dbi↦patt_free_svar X]
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1'
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi1' ∪ free_evars phi2))
ρ2': Valuation
Heqρ2': ρ2' = update_svar_val X (eval ρ phi2) ρ
Hfresh_subst: evar_is_fresh_in Xfr2' phi1' → evar_is_fresh_in Xu phi1' → eval (update_evar_val Xfr2' c ρ2') phi1'^{evar:0↦Xfr2'} = eval (update_evar_val Xu c ρ2') phi1'^{evar:0↦Xu}
ρe1': Valuation
Heqρe1': ρe1' = update_evar_val (fresh_evar phi1^[svar:dbi↦phi2]) c ρ
ρe2': Valuation
Heqρe2': ρe2' = update_evar_val Xu c ρ

eval ρe1' phi1^[svar:dbi↦phi2]^{evar:0↦fresh_evar phi1^[svar:dbi↦phi2]} = eval (update_evar_val Xu c ρ2') phi1'^{evar:0↦Xu}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (ex , phi1) (S dbi)
H: X ∉ free_svars phi1
c: M
phi1': Pattern
Heqphi1': phi1' = phi1^[svar:dbi↦patt_free_svar X]
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1'
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi1' ∪ free_evars phi2))
ρ2': Valuation
Heqρ2': ρ2' = update_svar_val X (eval ρ phi2) ρ
Hfresh_subst: evar_is_fresh_in Xfr2' phi1' → evar_is_fresh_in Xu phi1' → eval (update_evar_val Xfr2' c ρ2') phi1'^{evar:0↦Xfr2'} = eval (update_evar_val Xu c ρ2') phi1'^{evar:0↦Xu}
ρe1': Valuation
Heqρe1': ρe1' = update_evar_val (fresh_evar phi1^[svar:dbi↦phi2]) c ρ
ρe2': Valuation
Heqρe2': ρe2' = update_evar_val Xu c ρ

eval ρe1' phi1^{evar:0↦fresh_evar phi1^[svar:dbi↦phi2]}^[svar:dbi↦phi2] = eval (update_evar_val Xu c ρ2') phi1'^{evar:0↦Xu}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (ex , phi1) (S dbi)
H: X ∉ free_svars phi1
c: M
phi1': Pattern
Heqphi1': phi1' = phi1^[svar:dbi↦patt_free_svar X]
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1'
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi1' ∪ free_evars phi2))
ρ2': Valuation
Heqρ2': ρ2' = update_svar_val X (eval ρ phi2) ρ
Hfresh_subst: evar_is_fresh_in Xfr2' phi1' → evar_is_fresh_in Xu phi1' → eval (update_evar_val Xfr2' c ρ2') phi1'^{evar:0↦Xfr2'} = eval (update_evar_val Xu c ρ2') phi1'^{evar:0↦Xu}
ρe1': Valuation
Heqρe1': ρe1' = update_evar_val (fresh_evar phi1^[svar:dbi↦phi2]) c ρ
ρe2': Valuation
Heqρe2': ρe2' = update_evar_val Xu c ρ
well_formed_closed phi2
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (ex , phi1) (S dbi)
H: X ∉ free_svars phi1
c: M
phi1': Pattern
Heqphi1': phi1' = phi1^[svar:dbi↦patt_free_svar X]
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1'
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi1' ∪ free_evars phi2))
ρ2': Valuation
Heqρ2': ρ2' = update_svar_val X (eval ρ phi2) ρ
Hfresh_subst: evar_is_fresh_in Xfr2' phi1' → evar_is_fresh_in Xu phi1' → eval (update_evar_val Xfr2' c ρ2') phi1'^{evar:0↦Xfr2'} = eval (update_evar_val Xu c ρ2') phi1'^{evar:0↦Xu}
ρe1': Valuation
Heqρe1': ρe1' = update_evar_val (fresh_evar phi1^[svar:dbi↦phi2]) c ρ
ρe2': Valuation
Heqρe2': ρe2' = update_evar_val Xu c ρ

eval ρe1' phi1^{evar:0↦fresh_evar phi1^[svar:dbi↦phi2]}^[svar:dbi↦phi2] = eval (update_evar_val Xu c ρ2') phi1'^{evar:0↦Xu}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (ex , phi1) (S dbi)
H: X ∉ free_svars phi1
c: M
phi1': Pattern
Heqphi1': phi1' = phi1^[svar:dbi↦patt_free_svar X]
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1'
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi1' ∪ free_evars phi2))
ρ2': Valuation
Heqρ2': ρ2' = update_svar_val X (eval ρ phi2) ρ
Hfresh_subst: evar_is_fresh_in Xfr2' phi1' → evar_is_fresh_in Xu phi1' → eval (update_evar_val Xfr2' c ρ2') phi1'^{evar:0↦Xfr2'} = eval (update_evar_val Xu c ρ2') phi1'^{evar:0↦Xu}
ρe1': Valuation
Xfr1: evar
HeqXfr1: Xfr1 = fresh_evar phi1^[svar:dbi↦phi2]
Heqρe1': ρe1' = update_evar_val Xfr1 c ρ
ρe2': Valuation
Heqρe2': ρe2' = update_evar_val Xu c ρ

eval ρe1' phi1^{evar:0↦Xfr1}^[svar:dbi↦phi2] = eval (update_evar_val Xu c ρ2') phi1'^{evar:0↦Xu}
(* dbi may or may not occur in phi1 *)
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (ex , phi1) (S dbi)
H: X ∉ free_svars phi1
c: M
phi1': Pattern
Heqphi1': phi1' = phi1^[svar:dbi↦patt_free_svar X]
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1'
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi1' ∪ free_evars phi2))
ρ2': Valuation
Heqρ2': ρ2' = update_svar_val X (eval ρ phi2) ρ
Hfresh_subst: evar_is_fresh_in Xfr2' phi1' → evar_is_fresh_in Xu phi1' → eval (update_evar_val Xfr2' c ρ2') phi1'^{evar:0↦Xfr2'} = eval (update_evar_val Xu c ρ2') phi1'^{evar:0↦Xu}
ρe1': Valuation
Xfr1: evar
HeqXfr1: Xfr1 = fresh_evar phi1^[svar:dbi↦phi2]
Heqρe1': ρe1' = update_evar_val Xfr1 c ρ
ρe2': Valuation
Heqρe2': ρe2' = update_evar_val Xu c ρ
Hoc: bool
HeqHoc: Hoc = bsvar_occur phi1 dbi

eval ρe1' phi1^{evar:0↦Xfr1}^[svar:dbi↦phi2] = eval (update_evar_val Xu c ρ2') phi1'^{evar:0↦Xu}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (ex , phi1) (S dbi)
H: X ∉ free_svars phi1
c: M
phi1': Pattern
Heqphi1': phi1' = phi1^[svar:dbi↦patt_free_svar X]
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1'
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi1' ∪ free_evars phi2))
ρ2': Valuation
Heqρ2': ρ2' = update_svar_val X (eval ρ phi2) ρ
Hfresh_subst: evar_is_fresh_in Xfr2' phi1' → evar_is_fresh_in Xu phi1' → eval (update_evar_val Xfr2' c ρ2') phi1'^{evar:0↦Xfr2'} = eval (update_evar_val Xu c ρ2') phi1'^{evar:0↦Xu}
ρe1': Valuation
Xfr1: evar
HeqXfr1: Xfr1 = fresh_evar phi1^[svar:dbi↦phi2]
Heqρe1': ρe1' = update_evar_val Xfr1 c ρ
ρe2': Valuation
Heqρe2': ρe2' = update_evar_val Xu c ρ
Hoc: bool

Hoc = bsvar_occur phi1 dbi → eval ρe1' phi1^{evar:0↦Xfr1}^[svar:dbi↦phi2] = eval (update_evar_val Xu c ρ2') phi1'^{evar:0↦Xu}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (ex , phi1) (S dbi)
H: X ∉ free_svars phi1
c: M
phi1': Pattern
Heqphi1': phi1' = phi1^[svar:dbi↦patt_free_svar X]
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1'
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi1' ∪ free_evars phi2))
ρ2': Valuation
Heqρ2': ρ2' = update_svar_val X (eval ρ phi2) ρ
Hfresh_subst: evar_is_fresh_in Xfr2' phi1' → evar_is_fresh_in Xu phi1' → eval (update_evar_val Xfr2' c ρ2') phi1'^{evar:0↦Xfr2'} = eval (update_evar_val Xu c ρ2') phi1'^{evar:0↦Xu}
ρe1': Valuation
Xfr1: evar
HeqXfr1: Xfr1 = fresh_evar phi1^[svar:dbi↦phi2]
Heqρe1': ρe1' = update_evar_val Xfr1 c ρ
ρe2': Valuation
Heqρe2': ρe2' = update_evar_val Xu c ρ
HeqHoc: true = bsvar_occur phi1 dbi

eval ρe1' phi1^{evar:0↦Xfr1}^[svar:dbi↦phi2] = eval (update_evar_val Xu c ρ2') phi1'^{evar:0↦Xu}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (ex , phi1) (S dbi)
H: X ∉ free_svars phi1
c: M
phi1': Pattern
Heqphi1': phi1' = phi1^[svar:dbi↦patt_free_svar X]
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1'
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi1' ∪ free_evars phi2))
ρ2': Valuation
Heqρ2': ρ2' = update_svar_val X (eval ρ phi2) ρ
Hfresh_subst: evar_is_fresh_in Xfr2' phi1' → evar_is_fresh_in Xu phi1' → eval (update_evar_val Xfr2' c ρ2') phi1'^{evar:0↦Xfr2'} = eval (update_evar_val Xu c ρ2') phi1'^{evar:0↦Xu}
ρe1': Valuation
Xfr1: evar
HeqXfr1: Xfr1 = fresh_evar phi1^[svar:dbi↦phi2]
Heqρe1': ρe1' = update_evar_val Xfr1 c ρ
ρe2': Valuation
Heqρe2': ρe2' = update_evar_val Xu c ρ
HeqHoc: false = bsvar_occur phi1 dbi
eval ρe1' phi1^{evar:0↦Xfr1}^[svar:dbi↦phi2] = eval (update_evar_val Xu c ρ2') phi1'^{evar:0↦Xu}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (ex , phi1) (S dbi)
H: X ∉ free_svars phi1
c: M
phi1': Pattern
Heqphi1': phi1' = phi1^[svar:dbi↦patt_free_svar X]
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1'
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi1' ∪ free_evars phi2))
ρ2': Valuation
Heqρ2': ρ2' = update_svar_val X (eval ρ phi2) ρ
Hfresh_subst: evar_is_fresh_in Xfr2' phi1' → evar_is_fresh_in Xu phi1' → eval (update_evar_val Xfr2' c ρ2') phi1'^{evar:0↦Xfr2'} = eval (update_evar_val Xu c ρ2') phi1'^{evar:0↦Xu}
ρe1': Valuation
Xfr1: evar
HeqXfr1: Xfr1 = fresh_evar phi1^[svar:dbi↦phi2]
Heqρe1': ρe1' = update_evar_val Xfr1 c ρ
ρe2': Valuation
Heqρe2': ρe2' = update_evar_val Xu c ρ
HeqHoc: true = bsvar_occur phi1 dbi

eval ρe1' phi1^{evar:0↦Xfr1}^[svar:dbi↦phi2] = eval (update_evar_val Xu c ρ2') phi1'^{evar:0↦Xu}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (ex , phi1) (S dbi)
H: X ∉ free_svars phi1
c: M
phi1': Pattern
Heqphi1': phi1' = phi1^[svar:dbi↦patt_free_svar X]
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1'
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi1' ∪ free_evars phi2))
ρ2': Valuation
Heqρ2': ρ2' = update_svar_val X (eval ρ phi2) ρ
Hfresh_subst: evar_is_fresh_in Xfr2' phi1' → evar_is_fresh_in Xu phi1' → eval (update_evar_val Xfr2' c ρ2') phi1'^{evar:0↦Xfr2'} = eval (update_evar_val Xu c ρ2') phi1'^{evar:0↦Xu}
ρe1': Valuation
Xfr1: evar
HeqXfr1: Xfr1 = fresh_evar phi1^[svar:dbi↦phi2]
Heqρe1': ρe1' = update_evar_val Xfr1 c ρ
ρe2': Valuation
Heqρe2': ρe2' = update_evar_val Xu c ρ
HeqHoc: true = bsvar_occur phi1 dbi
HXfr1Fresh: evar_is_fresh_in (fresh_evar phi1^[svar:dbi↦phi2]) phi1^[svar:dbi↦phi2]

eval ρe1' phi1^{evar:0↦Xfr1}^[svar:dbi↦phi2] = eval (update_evar_val Xu c ρ2') phi1'^{evar:0↦Xu}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (ex , phi1) (S dbi)
H: X ∉ free_svars phi1
c: M
phi1': Pattern
Heqphi1': phi1' = phi1^[svar:dbi↦patt_free_svar X]
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1'
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi1' ∪ free_evars phi2))
ρ2': Valuation
Heqρ2': ρ2' = update_svar_val X (eval ρ phi2) ρ
Hfresh_subst: evar_is_fresh_in Xfr2' phi1' → evar_is_fresh_in Xu phi1' → eval (update_evar_val Xfr2' c ρ2') phi1'^{evar:0↦Xfr2'} = eval (update_evar_val Xu c ρ2') phi1'^{evar:0↦Xu}
ρe1': Valuation
Xfr1: evar
HeqXfr1: Xfr1 = fresh_evar phi1^[svar:dbi↦phi2]
Heqρe1': ρe1' = update_evar_val Xfr1 c ρ
ρe2': Valuation
Heqρe2': ρe2' = update_evar_val Xu c ρ
HeqHoc: true = bsvar_occur phi1 dbi
HXfr1Fresh: evar_is_fresh_in Xfr1 phi1^[svar:dbi↦phi2]

eval ρe1' phi1^{evar:0↦Xfr1}^[svar:dbi↦phi2] = eval (update_evar_val Xu c ρ2') phi1'^{evar:0↦Xu}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (ex , phi1) (S dbi)
H: X ∉ free_svars phi1
c: M
phi1': Pattern
Heqphi1': phi1' = phi1^[svar:dbi↦patt_free_svar X]
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1'
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi1' ∪ free_evars phi2))
ρ2': Valuation
Heqρ2': ρ2' = update_svar_val X (eval ρ phi2) ρ
Hfresh_subst: evar_is_fresh_in Xfr2' phi1' → evar_is_fresh_in Xu phi1' → eval (update_evar_val Xfr2' c ρ2') phi1'^{evar:0↦Xfr2'} = eval (update_evar_val Xu c ρ2') phi1'^{evar:0↦Xu}
ρe1': Valuation
Xfr1: evar
HeqXfr1: Xfr1 = fresh_evar phi1^[svar:dbi↦phi2]
Heqρe1': ρe1' = update_evar_val Xfr1 c ρ
ρe2': Valuation
Heqρe2': ρe2' = update_evar_val Xu c ρ
HeqHoc: bsvar_occur phi1 dbi = true
HXfr1Fresh: evar_is_fresh_in Xfr1 phi1^[svar:dbi↦phi2]

eval ρe1' phi1^{evar:0↦Xfr1}^[svar:dbi↦phi2] = eval (update_evar_val Xu c ρ2') phi1'^{evar:0↦Xu}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (ex , phi1) (S dbi)
H: X ∉ free_svars phi1
c: M
phi1': Pattern
Heqphi1': phi1' = phi1^[svar:dbi↦patt_free_svar X]
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1'
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi1' ∪ free_evars phi2))
ρ2': Valuation
Heqρ2': ρ2' = update_svar_val X (eval ρ phi2) ρ
Hfresh_subst: evar_is_fresh_in Xfr2' phi1' → evar_is_fresh_in Xu phi1' → eval (update_evar_val Xfr2' c ρ2') phi1'^{evar:0↦Xfr2'} = eval (update_evar_val Xu c ρ2') phi1'^{evar:0↦Xu}
ρe1': Valuation
Xfr1: evar
HeqXfr1: Xfr1 = fresh_evar phi1^[svar:dbi↦phi2]
Heqρe1': ρe1' = update_evar_val Xfr1 c ρ
ρe2': Valuation
Heqρe2': ρe2' = update_evar_val Xu c ρ
HeqHoc: bsvar_occur phi1 dbi = true
HXfr1Fresh: evar_is_fresh_in Xfr1 phi1^[svar:dbi↦phi2]
Hsub: is_subformula_of_ind phi2 phi1^[svar:dbi↦phi2]

eval ρe1' phi1^{evar:0↦Xfr1}^[svar:dbi↦phi2] = eval (update_evar_val Xu c ρ2') phi1'^{evar:0↦Xu}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (ex , phi1) (S dbi)
H: X ∉ free_svars phi1
c: M
phi1': Pattern
Heqphi1': phi1' = phi1^[svar:dbi↦patt_free_svar X]
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1'
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi1' ∪ free_evars phi2))
ρ2': Valuation
Heqρ2': ρ2' = update_svar_val X (eval ρ phi2) ρ
Hfresh_subst: evar_is_fresh_in Xfr2' phi1' → evar_is_fresh_in Xu phi1' → eval (update_evar_val Xfr2' c ρ2') phi1'^{evar:0↦Xfr2'} = eval (update_evar_val Xu c ρ2') phi1'^{evar:0↦Xu}
ρe1': Valuation
Xfr1: evar
HeqXfr1: Xfr1 = fresh_evar phi1^[svar:dbi↦phi2]
Heqρe1': ρe1' = update_evar_val Xfr1 c ρ
ρe2': Valuation
Heqρe2': ρe2' = update_evar_val Xu c ρ
HeqHoc: bsvar_occur phi1 dbi = true
HXfr1Fresh: evar_is_fresh_in Xfr1 phi1^[svar:dbi↦phi2]
Hsub: is_subformula_of_ind phi2 phi1^[svar:dbi↦phi2]
HXfr1Fresh2: evar_is_fresh_in Xfr1 phi2

eval ρe1' phi1^{evar:0↦Xfr1}^[svar:dbi↦phi2] = eval (update_evar_val Xu c ρ2') phi1'^{evar:0↦Xu}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (ex , phi1) (S dbi)
H: X ∉ free_svars phi1
c: M
phi1': Pattern
Heqphi1': phi1' = phi1^[svar:dbi↦patt_free_svar X]
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1'
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi1' ∪ free_evars phi2))
ρ2': Valuation
Heqρ2': ρ2' = update_svar_val X (eval ρ phi2) ρ
Hfresh_subst: evar_is_fresh_in Xfr2' phi1' → evar_is_fresh_in Xu phi1' → eval (update_evar_val Xfr2' c ρ2') phi1'^{evar:0↦Xfr2'} = eval (update_evar_val Xu c ρ2') phi1'^{evar:0↦Xu}
ρe1': Valuation
Xfr1: evar
HeqXfr1: Xfr1 = fresh_evar phi1^[svar:dbi↦phi2]
Heqρe1': ρe1' = update_evar_val Xfr1 c ρ
ρe2': Valuation
Heqρe2': ρe2' = update_evar_val Xu c ρ
HeqHoc: bsvar_occur phi1 dbi = true
HXfr1Fresh: evar_is_fresh_in Xfr1 phi1^[svar:dbi↦phi2]
Hsub: is_subformula_of_ind phi2 phi1^[svar:dbi↦phi2]
HXfr1Fresh2: evar_is_fresh_in Xfr1 phi2

eval ρe1' phi2 = eval ρ phi2
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (ex , phi1) (S dbi)
H: X ∉ free_svars phi1
c: M
phi1': Pattern
Heqphi1': phi1' = phi1^[svar:dbi↦patt_free_svar X]
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1'
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi1' ∪ free_evars phi2))
ρ2': Valuation
Heqρ2': ρ2' = update_svar_val X (eval ρ phi2) ρ
Hfresh_subst: evar_is_fresh_in Xfr2' phi1' → evar_is_fresh_in Xu phi1' → eval (update_evar_val Xfr2' c ρ2') phi1'^{evar:0↦Xfr2'} = eval (update_evar_val Xu c ρ2') phi1'^{evar:0↦Xu}
ρe1': Valuation
Xfr1: evar
HeqXfr1: Xfr1 = fresh_evar phi1^[svar:dbi↦phi2]
Heqρe1': ρe1' = update_evar_val Xfr1 c ρ
ρe2': Valuation
Heqρe2': ρe2' = update_evar_val Xu c ρ
HeqHoc: bsvar_occur phi1 dbi = true
HXfr1Fresh: evar_is_fresh_in Xfr1 phi1^[svar:dbi↦phi2]
Hsub: is_subformula_of_ind phi2 phi1^[svar:dbi↦phi2]
HXfr1Fresh2: evar_is_fresh_in Xfr1 phi2
Hinterp: eval ρe1' phi2 = eval ρ phi2
eval ρe1' phi1^{evar:0↦Xfr1}^[svar:dbi↦phi2] = eval (update_evar_val Xu c ρ2') phi1'^{evar:0↦Xu}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (ex , phi1) (S dbi)
H: X ∉ free_svars phi1
c: M
phi1': Pattern
Heqphi1': phi1' = phi1^[svar:dbi↦patt_free_svar X]
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1'
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi1' ∪ free_evars phi2))
ρ2': Valuation
Heqρ2': ρ2' = update_svar_val X (eval ρ phi2) ρ
Hfresh_subst: evar_is_fresh_in Xfr2' phi1' → evar_is_fresh_in Xu phi1' → eval (update_evar_val Xfr2' c ρ2') phi1'^{evar:0↦Xfr2'} = eval (update_evar_val Xu c ρ2') phi1'^{evar:0↦Xu}
ρe1': Valuation
Xfr1: evar
HeqXfr1: Xfr1 = fresh_evar phi1^[svar:dbi↦phi2]
Heqρe1': ρe1' = update_evar_val Xfr1 c ρ
ρe2': Valuation
Heqρe2': ρe2' = update_evar_val Xu c ρ
HeqHoc: bsvar_occur phi1 dbi = true
HXfr1Fresh: evar_is_fresh_in Xfr1 phi1^[svar:dbi↦phi2]
Hsub: is_subformula_of_ind phi2 phi1^[svar:dbi↦phi2]
HXfr1Fresh2: evar_is_fresh_in Xfr1 phi2

eval ρe1' phi2 = eval ρ phi2
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (ex , phi1) (S dbi)
H: X ∉ free_svars phi1
c: M
Hfresh_subst: evar_is_fresh_in (fresh_evar phi1^[svar:dbi↦patt_free_svar X]) phi1^[svar:dbi↦patt_free_svar X] → evar_is_fresh_in (evar_fresh (elements (free_evars phi1^[svar:dbi↦ patt_free_svar X] ∪ free_evars phi2))) phi1^[svar:dbi↦patt_free_svar X] → eval (update_evar_val (fresh_evar phi1^[svar:dbi↦ patt_free_svar X]) c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦ fresh_evar phi1^[svar:dbi↦ patt_free_svar X]} = eval (update_evar_val (evar_fresh (elements (free_evars phi1^[svar:dbi↦ patt_free_svar X] ∪ free_evars phi2))) c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦ evar_fresh (elements (free_evars phi1^[svar:dbi↦ patt_free_svar X] ∪ free_evars phi2))}
HeqHoc: bsvar_occur phi1 dbi = true
HXfr1Fresh: evar_is_fresh_in (fresh_evar phi1^[svar:dbi↦phi2]) phi1^[svar:dbi↦phi2]
Hsub: is_subformula_of_ind phi2 phi1^[svar:dbi↦phi2]
HXfr1Fresh2: evar_is_fresh_in (fresh_evar phi1^[svar:dbi↦phi2]) phi2

eval (update_evar_val (fresh_evar phi1^[svar:dbi↦phi2]) c ρ) phi2 = eval ρ phi2
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (ex , phi1) (S dbi)
H: X ∉ free_svars phi1
c: M
Hfresh_subst: evar_is_fresh_in (fresh_evar phi1^[svar:dbi↦patt_free_svar X]) phi1^[svar:dbi↦patt_free_svar X] → evar_is_fresh_in (evar_fresh (elements (free_evars phi1^[svar:dbi↦ patt_free_svar X] ∪ free_evars phi2))) phi1^[svar:dbi↦patt_free_svar X] → eval (update_evar_val (fresh_evar phi1^[svar:dbi↦ patt_free_svar X]) c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦ fresh_evar phi1^[svar:dbi↦ patt_free_svar X]} = eval (update_evar_val (evar_fresh (elements (free_evars phi1^[svar:dbi↦ patt_free_svar X] ∪ free_evars phi2))) c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦ evar_fresh (elements (free_evars phi1^[svar:dbi↦ patt_free_svar X] ∪ free_evars phi2))}
HeqHoc: bsvar_occur phi1 dbi = true
HXfr1Fresh: evar_is_fresh_in (fresh_evar phi1^[svar:dbi↦phi2]) phi1^[svar:dbi↦phi2]
Hsub: is_subformula_of_ind phi2 phi1^[svar:dbi↦phi2]
HXfr1Fresh2: evar_is_fresh_in (fresh_evar phi1^[svar:dbi↦phi2]) phi2

evar_is_fresh_in (fresh_evar phi1^[svar:dbi↦phi2]) phi2
auto.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (ex , phi1) (S dbi)
H: X ∉ free_svars phi1
c: M
phi1': Pattern
Heqphi1': phi1' = phi1^[svar:dbi↦patt_free_svar X]
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1'
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi1' ∪ free_evars phi2))
ρ2': Valuation
Heqρ2': ρ2' = update_svar_val X (eval ρ phi2) ρ
Hfresh_subst: evar_is_fresh_in Xfr2' phi1' → evar_is_fresh_in Xu phi1' → eval (update_evar_val Xfr2' c ρ2') phi1'^{evar:0↦Xfr2'} = eval (update_evar_val Xu c ρ2') phi1'^{evar:0↦Xu}
ρe1': Valuation
Xfr1: evar
HeqXfr1: Xfr1 = fresh_evar phi1^[svar:dbi↦phi2]
Heqρe1': ρe1' = update_evar_val Xfr1 c ρ
ρe2': Valuation
Heqρe2': ρe2' = update_evar_val Xu c ρ
HeqHoc: bsvar_occur phi1 dbi = true
HXfr1Fresh: evar_is_fresh_in Xfr1 phi1^[svar:dbi↦phi2]
Hsub: is_subformula_of_ind phi2 phi1^[svar:dbi↦phi2]
HXfr1Fresh2: evar_is_fresh_in Xfr1 phi2
Hinterp: eval ρe1' phi2 = eval ρ phi2

eval ρe1' phi1^{evar:0↦Xfr1}^[svar:dbi↦phi2] = eval (update_evar_val Xu c ρ2') phi1'^{evar:0↦Xu}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (ex , phi1) (S dbi)
H: X ∉ free_svars phi1
c: M
phi1': Pattern
Heqphi1': phi1' = phi1^[svar:dbi↦patt_free_svar X]
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1'
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi1' ∪ free_evars phi2))
ρ2': Valuation
Heqρ2': ρ2' = update_svar_val X (eval ρ phi2) ρ
Hfresh_subst: evar_is_fresh_in Xfr2' phi1' → evar_is_fresh_in Xu phi1' → eval (update_evar_val Xfr2' c ρ2') phi1'^{evar:0↦Xfr2'} = eval (update_evar_val Xu c ρ2') phi1'^{evar:0↦Xu}
ρe1': Valuation
Xfr1: evar
HeqXfr1: Xfr1 = fresh_evar phi1^[svar:dbi↦phi2]
Heqρe1': ρe1' = update_evar_val Xfr1 c ρ
ρe2': Valuation
Heqρe2': ρe2' = update_evar_val Xu c ρ
HeqHoc: bsvar_occur phi1 dbi = true
HXfr1Fresh: evar_is_fresh_in Xfr1 phi1^[svar:dbi↦phi2]
Hsub: is_subformula_of_ind phi2 phi1^[svar:dbi↦phi2]
HXfr1Fresh2: evar_is_fresh_in Xfr1 phi2
Hinterp: eval ρe1' phi2 = eval ρ phi2

update_svar_val X (eval ρe1' phi2) ρ = update_svar_val X (eval ρ phi2) ρ
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (ex , phi1) (S dbi)
H: X ∉ free_svars phi1
c: M
phi1': Pattern
Heqphi1': phi1' = phi1^[svar:dbi↦patt_free_svar X]
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1'
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi1' ∪ free_evars phi2))
ρ2': Valuation
Heqρ2': ρ2' = update_svar_val X (eval ρ phi2) ρ
Hfresh_subst: evar_is_fresh_in Xfr2' phi1' → evar_is_fresh_in Xu phi1' → eval (update_evar_val Xfr2' c ρ2') phi1'^{evar:0↦Xfr2'} = eval (update_evar_val Xu c ρ2') phi1'^{evar:0↦Xu}
ρe1': Valuation
Xfr1: evar
HeqXfr1: Xfr1 = fresh_evar phi1^[svar:dbi↦phi2]
Heqρe1': ρe1' = update_evar_val Xfr1 c ρ
ρe2': Valuation
Heqρe2': ρe2' = update_evar_val Xu c ρ
HeqHoc: bsvar_occur phi1 dbi = true
HXfr1Fresh: evar_is_fresh_in Xfr1 phi1^[svar:dbi↦phi2]
Hsub: is_subformula_of_ind phi2 phi1^[svar:dbi↦phi2]
HXfr1Fresh2: evar_is_fresh_in Xfr1 phi2
Hinterp: eval ρe1' phi2 = eval ρ phi2
He1e1': update_svar_val X (eval ρe1' phi2) ρ = update_svar_val X (eval ρ phi2) ρ
eval ρe1' phi1^{evar:0↦Xfr1}^[svar:dbi↦phi2] = eval (update_evar_val Xu c ρ2') phi1'^{evar:0↦Xu}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (ex , phi1) (S dbi)
H: X ∉ free_svars phi1
c: M
phi1': Pattern
Heqphi1': phi1' = phi1^[svar:dbi↦patt_free_svar X]
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1'
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi1' ∪ free_evars phi2))
ρ2': Valuation
Heqρ2': ρ2' = update_svar_val X (eval ρ phi2) ρ
Hfresh_subst: evar_is_fresh_in Xfr2' phi1' → evar_is_fresh_in Xu phi1' → eval (update_evar_val Xfr2' c ρ2') phi1'^{evar:0↦Xfr2'} = eval (update_evar_val Xu c ρ2') phi1'^{evar:0↦Xu}
ρe1': Valuation
Xfr1: evar
HeqXfr1: Xfr1 = fresh_evar phi1^[svar:dbi↦phi2]
Heqρe1': ρe1' = update_evar_val Xfr1 c ρ
ρe2': Valuation
Heqρe2': ρe2' = update_evar_val Xu c ρ
HeqHoc: bsvar_occur phi1 dbi = true
HXfr1Fresh: evar_is_fresh_in Xfr1 phi1^[svar:dbi↦phi2]
Hsub: is_subformula_of_ind phi2 phi1^[svar:dbi↦phi2]
HXfr1Fresh2: evar_is_fresh_in Xfr1 phi2
Hinterp: eval ρe1' phi2 = eval ρ phi2

update_svar_val X (eval ρe1' phi2) ρ = update_svar_val X (eval ρ phi2) ρ
congruence.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (ex , phi1) (S dbi)
H: X ∉ free_svars phi1
c: M
phi1': Pattern
Heqphi1': phi1' = phi1^[svar:dbi↦patt_free_svar X]
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1'
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi1' ∪ free_evars phi2))
ρ2': Valuation
Heqρ2': ρ2' = update_svar_val X (eval ρ phi2) ρ
Hfresh_subst: evar_is_fresh_in Xfr2' phi1' → evar_is_fresh_in Xu phi1' → eval (update_evar_val Xfr2' c ρ2') phi1'^{evar:0↦Xfr2'} = eval (update_evar_val Xu c ρ2') phi1'^{evar:0↦Xu}
ρe1': Valuation
Xfr1: evar
HeqXfr1: Xfr1 = fresh_evar phi1^[svar:dbi↦phi2]
Heqρe1': ρe1' = update_evar_val Xfr1 c ρ
ρe2': Valuation
Heqρe2': ρe2' = update_evar_val Xu c ρ
HeqHoc: bsvar_occur phi1 dbi = true
HXfr1Fresh: evar_is_fresh_in Xfr1 phi1^[svar:dbi↦phi2]
Hsub: is_subformula_of_ind phi2 phi1^[svar:dbi↦phi2]
HXfr1Fresh2: evar_is_fresh_in Xfr1 phi2
Hinterp: eval ρe1' phi2 = eval ρ phi2
He1e1': update_svar_val X (eval ρe1' phi2) ρ = update_svar_val X (eval ρ phi2) ρ

eval ρe1' phi1^{evar:0↦Xfr1}^[svar:dbi↦phi2] = eval (update_evar_val Xu c ρ2') phi1'^{evar:0↦Xu}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (ex , phi1) (S dbi)
H: X ∉ free_svars phi1
c: M
phi1': Pattern
Heqphi1': phi1' = phi1^[svar:dbi↦patt_free_svar X]
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1'
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi1' ∪ free_evars phi2))
Hfresh_subst: evar_is_fresh_in Xfr2' phi1' → evar_is_fresh_in Xu phi1' → eval (update_evar_val Xfr2' c (update_svar_val X (eval ρ phi2) ρ)) phi1'^{evar:0↦Xfr2'} = eval (update_evar_val Xu c (update_svar_val X (eval ρ phi2) ρ)) phi1'^{evar:0↦Xu}
ρe1': Valuation
Xfr1: evar
HeqXfr1: Xfr1 = fresh_evar phi1^[svar:dbi↦phi2]
Heqρe1': ρe1' = update_evar_val Xfr1 c ρ
ρe2': Valuation
Heqρe2': ρe2' = update_evar_val Xu c ρ
HeqHoc: bsvar_occur phi1 dbi = true
HXfr1Fresh: evar_is_fresh_in Xfr1 phi1^[svar:dbi↦phi2]
Hsub: is_subformula_of_ind phi2 phi1^[svar:dbi↦phi2]
HXfr1Fresh2: evar_is_fresh_in Xfr1 phi2
Hinterp: eval ρe1' phi2 = eval ρ phi2
He1e1': update_svar_val X (eval ρe1' phi2) ρ = update_svar_val X (eval ρ phi2) ρ

eval ρe1' phi1^{evar:0↦Xfr1}^[svar:dbi↦phi2] = eval (update_evar_val Xu c (update_svar_val X (eval ρ phi2) ρ)) phi1'^{evar:0↦Xu}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (ex , phi1) (S dbi)
H: X ∉ free_svars phi1
c: M
phi1': Pattern
Heqphi1': phi1' = phi1^[svar:dbi↦patt_free_svar X]
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1'
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi1' ∪ free_evars phi2))
Hfresh_subst: evar_is_fresh_in Xfr2' phi1' → evar_is_fresh_in Xu phi1' → eval (update_evar_val Xfr2' c (update_svar_val X (eval ρ phi2) ρ)) phi1'^{evar:0↦Xfr2'} = eval (update_evar_val Xu c (update_svar_val X (eval ρ phi2) ρ)) phi1'^{evar:0↦Xu}
ρe1': Valuation
Xfr1: evar
HeqXfr1: Xfr1 = fresh_evar phi1^[svar:dbi↦phi2]
Heqρe1': ρe1' = update_evar_val Xfr1 c ρ
ρe2': Valuation
Heqρe2': ρe2' = update_evar_val Xu c ρ
HeqHoc: bsvar_occur phi1 dbi = true
HXfr1Fresh: evar_is_fresh_in Xfr1 phi1^[svar:dbi↦phi2]
Hsub: is_subformula_of_ind phi2 phi1^[svar:dbi↦phi2]
HXfr1Fresh2: evar_is_fresh_in Xfr1 phi2
Hinterp: eval ρe1' phi2 = eval ρ phi2
He1e1': update_svar_val X (eval ρe1' phi2) ρ = update_svar_val X (eval ρ phi2) ρ

eval ρe1' phi1^{evar:0↦Xfr1}^[svar:dbi↦phi2] = eval (update_evar_val Xu c (update_svar_val X (eval ρe1' phi2) ρ)) phi1'^{evar:0↦Xu}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (ex , phi1) (S dbi)
H: X ∉ free_svars phi1
c: M
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1^[svar:dbi↦patt_free_svar X]
Xu: evar
Hfresh_subst: evar_is_fresh_in Xfr2' phi1^[svar:dbi↦patt_free_svar X] → evar_is_fresh_in Xu phi1^[svar:dbi↦patt_free_svar X] → eval (update_evar_val Xfr2' c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦Xfr2'} = eval (update_evar_val Xu c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦Xu}
HeqXu: Xu = evar_fresh (elements (free_evars phi1^[svar:dbi↦ patt_free_svar X] ∪ free_evars phi2))
ρe1': Valuation
Xfr1: evar
HeqXfr1: Xfr1 = fresh_evar phi1^[svar:dbi↦phi2]
Heqρe1': ρe1' = update_evar_val Xfr1 c ρ
ρe2': Valuation
Heqρe2': ρe2' = update_evar_val Xu c ρ
HeqHoc: bsvar_occur phi1 dbi = true
HXfr1Fresh: evar_is_fresh_in Xfr1 phi1^[svar:dbi↦phi2]
Hsub: is_subformula_of_ind phi2 phi1^[svar:dbi↦phi2]
HXfr1Fresh2: evar_is_fresh_in Xfr1 phi2
Hinterp: eval ρe1' phi2 = eval ρ phi2
He1e1': update_svar_val X (eval ρe1' phi2) ρ = update_svar_val X (eval ρ phi2) ρ

eval ρe1' phi1^{evar:0↦Xfr1}^[svar:dbi↦phi2] = eval (update_evar_val Xu c (update_svar_val X (eval ρe1' phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦Xu}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (ex , phi1) (S dbi)
H: X ∉ free_svars phi1
c: M
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1^[svar:dbi↦patt_free_svar X]
Xu: evar
Hfresh_subst: evar_is_fresh_in Xfr2' phi1^[svar:dbi↦patt_free_svar X] → evar_is_fresh_in Xu phi1^[svar:dbi↦patt_free_svar X] → eval (update_evar_val Xfr2' c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦Xfr2'} = eval (update_evar_val Xu c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦Xu}
HeqXu: Xu = evar_fresh (elements (free_evars phi1^[svar:dbi↦ patt_free_svar X] ∪ free_evars phi2))
ρe1': Valuation
Xfr1: evar
HeqXfr1: Xfr1 = fresh_evar phi1^[svar:dbi↦phi2]
Heqρe1': ρe1' = update_evar_val Xfr1 c ρ
ρe2': Valuation
Heqρe2': ρe2' = update_evar_val Xu c ρ
HeqHoc: bsvar_occur phi1 dbi = true
HXfr1Fresh: evar_is_fresh_in Xfr1 phi1^[svar:dbi↦phi2]
Hsub: is_subformula_of_ind phi2 phi1^[svar:dbi↦phi2]
HXfr1Fresh2: evar_is_fresh_in Xfr1 phi2
Hinterp: eval ρe1' phi2 = eval ρ phi2
He1e1': update_svar_val X (eval ρe1' phi2) ρ = update_svar_val X (eval ρ phi2) ρ

eval ρe1' phi1^{evar:0↦Xfr1}^[svar:dbi↦phi2] = eval (update_evar_val Xu c (update_svar_val X (eval ρe1' phi2) ρ)) phi1^{evar:0↦Xu}^[svar:dbi↦patt_free_svar X]
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (ex , phi1) (S dbi)
H: X ∉ free_svars phi1
c: M
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1^[svar:dbi↦patt_free_svar X]
Xu: evar
Hfresh_subst: evar_is_fresh_in Xfr2' phi1^[svar:dbi↦patt_free_svar X] → evar_is_fresh_in Xu phi1^[svar:dbi↦patt_free_svar X] → eval (update_evar_val Xfr2' c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦Xfr2'} = eval (update_evar_val Xu c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦Xu}
HeqXu: Xu = evar_fresh (elements (free_evars phi1^[svar:dbi↦ patt_free_svar X] ∪ free_evars phi2))
ρe1': Valuation
Xfr1: evar
HeqXfr1: Xfr1 = fresh_evar phi1^[svar:dbi↦phi2]
Heqρe1': ρe1' = update_evar_val Xfr1 c ρ
ρe2': Valuation
Heqρe2': ρe2' = update_evar_val Xu c ρ
HeqHoc: bsvar_occur phi1 dbi = true
HXfr1Fresh: evar_is_fresh_in Xfr1 phi1^[svar:dbi↦phi2]
Hsub: is_subformula_of_ind phi2 phi1^[svar:dbi↦phi2]
HXfr1Fresh2: evar_is_fresh_in Xfr1 phi2
Hinterp: eval ρe1' phi2 = eval ρ phi2
He1e1': update_svar_val X (eval ρe1' phi2) ρ = update_svar_val X (eval ρ phi2) ρ
well_formed_closed (patt_free_svar X)
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (ex , phi1) (S dbi)
H: X ∉ free_svars phi1
c: M
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1^[svar:dbi↦patt_free_svar X]
Xu: evar
Hfresh_subst: evar_is_fresh_in Xfr2' phi1^[svar:dbi↦patt_free_svar X] → evar_is_fresh_in Xu phi1^[svar:dbi↦patt_free_svar X] → eval (update_evar_val Xfr2' c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦Xfr2'} = eval (update_evar_val Xu c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦Xu}
HeqXu: Xu = evar_fresh (elements (free_evars phi1^[svar:dbi↦ patt_free_svar X] ∪ free_evars phi2))
ρe1': Valuation
Xfr1: evar
HeqXfr1: Xfr1 = fresh_evar phi1^[svar:dbi↦phi2]
Heqρe1': ρe1' = update_evar_val Xfr1 c ρ
ρe2': Valuation
Heqρe2': ρe2' = update_evar_val Xu c ρ
HeqHoc: bsvar_occur phi1 dbi = true
HXfr1Fresh: evar_is_fresh_in Xfr1 phi1^[svar:dbi↦phi2]
Hsub: is_subformula_of_ind phi2 phi1^[svar:dbi↦phi2]
HXfr1Fresh2: evar_is_fresh_in Xfr1 phi2
Hinterp: eval ρe1' phi2 = eval ρ phi2
He1e1': update_svar_val X (eval ρe1' phi2) ρ = update_svar_val X (eval ρ phi2) ρ

well_formed_closed (patt_free_svar X)
wf_auto2.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (ex , phi1) (S dbi)
H: X ∉ free_svars phi1
c: M
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1^[svar:dbi↦patt_free_svar X]
Xu: evar
Hfresh_subst: evar_is_fresh_in Xfr2' phi1^[svar:dbi↦patt_free_svar X] → evar_is_fresh_in Xu phi1^[svar:dbi↦patt_free_svar X] → eval (update_evar_val Xfr2' c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦Xfr2'} = eval (update_evar_val Xu c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦Xu}
HeqXu: Xu = evar_fresh (elements (free_evars phi1^[svar:dbi↦ patt_free_svar X] ∪ free_evars phi2))
ρe1': Valuation
Xfr1: evar
HeqXfr1: Xfr1 = fresh_evar phi1^[svar:dbi↦phi2]
Heqρe1': ρe1' = update_evar_val Xfr1 c ρ
ρe2': Valuation
Heqρe2': ρe2' = update_evar_val Xu c ρ
HeqHoc: bsvar_occur phi1 dbi = true
HXfr1Fresh: evar_is_fresh_in Xfr1 phi1^[svar:dbi↦phi2]
Hsub: is_subformula_of_ind phi2 phi1^[svar:dbi↦phi2]
HXfr1Fresh2: evar_is_fresh_in Xfr1 phi2
Hinterp: eval ρe1' phi2 = eval ρ phi2
He1e1': update_svar_val X (eval ρe1' phi2) ρ = update_svar_val X (eval ρ phi2) ρ

eval ρe1' phi1^{evar:0↦Xfr1}^[svar:dbi↦phi2] = eval (update_evar_val Xu c (update_svar_val X (eval ρe1' phi2) ρ)) phi1^{evar:0↦Xu}^[svar:dbi↦patt_free_svar X]
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (ex , phi1) (S dbi)
H: X ∉ free_svars phi1
c: M
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1^[svar:dbi↦patt_free_svar X]
Xu: evar
Hfresh_subst: evar_is_fresh_in Xfr2' phi1^[svar:dbi↦patt_free_svar X] → evar_is_fresh_in Xu phi1^[svar:dbi↦patt_free_svar X] → eval (update_evar_val Xfr2' c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦Xfr2'} = eval (update_evar_val Xu c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦Xu}
HeqXu: Xu = evar_fresh (elements (free_evars phi1^[svar:dbi↦ patt_free_svar X] ∪ free_evars phi2))
ρe1': Valuation
Xfr1: evar
HeqXfr1: Xfr1 = fresh_evar phi1^[svar:dbi↦phi2]
Heqρe1': ρe1' = update_evar_val Xfr1 c ρ
ρe2': Valuation
Heqρe2': ρe2' = update_evar_val Xu c ρ
HeqHoc: bsvar_occur phi1 dbi = true
HXfr1Fresh: evar_is_fresh_in Xfr1 phi1^[svar:dbi↦phi2]
Hsub: is_subformula_of_ind phi2 phi1^[svar:dbi↦phi2]
HXfr1Fresh2: evar_is_fresh_in Xfr1 phi2
Hinterp: eval ρe1' phi2 = eval ρ phi2
He1e1': update_svar_val X (eval ρe1' phi2) ρ = update_svar_val X (eval ρ phi2) ρ

Xfr1 = Xu
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (ex , phi1) (S dbi)
H: X ∉ free_svars phi1
c: M
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1^[svar:dbi↦patt_free_svar X]
Xu: evar
Hfresh_subst: evar_is_fresh_in Xfr2' phi1^[svar:dbi↦patt_free_svar X] → evar_is_fresh_in Xu phi1^[svar:dbi↦patt_free_svar X] → eval (update_evar_val Xfr2' c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦Xfr2'} = eval (update_evar_val Xu c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦Xu}
HeqXu: Xu = evar_fresh (elements (free_evars phi1^[svar:dbi↦ patt_free_svar X] ∪ free_evars phi2))
ρe1': Valuation
Xfr1: evar
HeqXfr1: Xfr1 = fresh_evar phi1^[svar:dbi↦phi2]
Heqρe1': ρe1' = update_evar_val Xfr1 c ρ
ρe2': Valuation
Heqρe2': ρe2' = update_evar_val Xu c ρ
HeqHoc: bsvar_occur phi1 dbi = true
HXfr1Fresh: evar_is_fresh_in Xfr1 phi1^[svar:dbi↦phi2]
Hsub: is_subformula_of_ind phi2 phi1^[svar:dbi↦phi2]
HXfr1Fresh2: evar_is_fresh_in Xfr1 phi2
Hinterp: eval ρe1' phi2 = eval ρ phi2
He1e1': update_svar_val X (eval ρe1' phi2) ρ = update_svar_val X (eval ρ phi2) ρ
HXu: Xfr1 = Xu
eval ρe1' phi1^{evar:0↦Xfr1}^[svar:dbi↦phi2] = eval (update_evar_val Xu c (update_svar_val X (eval ρe1' phi2) ρ)) phi1^{evar:0↦Xu}^[svar:dbi↦ patt_free_svar X]
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (ex , phi1) (S dbi)
H: X ∉ free_svars phi1
c: M
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1^[svar:dbi↦patt_free_svar X]
Xu: evar
Hfresh_subst: evar_is_fresh_in Xfr2' phi1^[svar:dbi↦patt_free_svar X] → evar_is_fresh_in Xu phi1^[svar:dbi↦patt_free_svar X] → eval (update_evar_val Xfr2' c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦Xfr2'} = eval (update_evar_val Xu c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦Xu}
HeqXu: Xu = evar_fresh (elements (free_evars phi1^[svar:dbi↦ patt_free_svar X] ∪ free_evars phi2))
ρe1': Valuation
Xfr1: evar
HeqXfr1: Xfr1 = fresh_evar phi1^[svar:dbi↦phi2]
Heqρe1': ρe1' = update_evar_val Xfr1 c ρ
ρe2': Valuation
Heqρe2': ρe2' = update_evar_val Xu c ρ
HeqHoc: bsvar_occur phi1 dbi = true
HXfr1Fresh: evar_is_fresh_in Xfr1 phi1^[svar:dbi↦phi2]
Hsub: is_subformula_of_ind phi2 phi1^[svar:dbi↦phi2]
HXfr1Fresh2: evar_is_fresh_in Xfr1 phi2
Hinterp: eval ρe1' phi2 = eval ρ phi2
He1e1': update_svar_val X (eval ρe1' phi2) ρ = update_svar_val X (eval ρ phi2) ρ

Xfr1 = Xu
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (ex , phi1) (S dbi)
H: X ∉ free_svars phi1
c: M
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1^[svar:dbi↦patt_free_svar X]
Xu: evar
Hfresh_subst: evar_is_fresh_in Xfr2' phi1^[svar:dbi↦patt_free_svar X] → evar_is_fresh_in Xu phi1^[svar:dbi↦patt_free_svar X] → eval (update_evar_val Xfr2' c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦Xfr2'} = eval (update_evar_val Xu c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦Xu}
HeqXu: Xu = evar_fresh (elements (free_evars phi1^[svar:dbi↦ patt_free_svar X] ∪ free_evars phi2))
ρe1': Valuation
Heqρe1': ρe1' = update_evar_val (fresh_evar phi1^[svar:dbi↦phi2]) c ρ
ρe2': Valuation
Heqρe2': ρe2' = update_evar_val Xu c ρ
HeqHoc: bsvar_occur phi1 dbi = true
HXfr1Fresh: evar_is_fresh_in (fresh_evar phi1^[svar:dbi↦phi2]) phi1^[svar:dbi↦phi2]
Hsub: is_subformula_of_ind phi2 phi1^[svar:dbi↦phi2]
HXfr1Fresh2: evar_is_fresh_in (fresh_evar phi1^[svar:dbi↦phi2]) phi2
Hinterp: eval ρe1' phi2 = eval ρ phi2
He1e1': update_svar_val X (eval ρe1' phi2) ρ = update_svar_val X (eval ρ phi2) ρ

fresh_evar phi1^[svar:dbi↦phi2] = Xu
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (ex , phi1) (S dbi)
H: X ∉ free_svars phi1
c: M
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1^[svar:dbi↦patt_free_svar X]
Hfresh_subst: evar_is_fresh_in Xfr2' phi1^[svar:dbi↦patt_free_svar X] → evar_is_fresh_in (evar_fresh (elements (free_evars phi1^[svar:dbi↦ patt_free_svar X] ∪ free_evars phi2))) phi1^[svar:dbi↦patt_free_svar X] → eval (update_evar_val Xfr2' c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦Xfr2'} = eval (update_evar_val (evar_fresh (elements (free_evars phi1^[svar:dbi↦ patt_free_svar X] ∪ free_evars phi2))) c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦ evar_fresh (elements (free_evars phi1^[svar:dbi↦ patt_free_svar X] ∪ free_evars phi2))}
ρe1': Valuation
Heqρe1': ρe1' = update_evar_val (fresh_evar phi1^[svar:dbi↦phi2]) c ρ
ρe2': Valuation
Heqρe2': ρe2' = update_evar_val (evar_fresh (elements (free_evars phi1^[svar:dbi↦ patt_free_svar X] ∪ free_evars phi2))) c ρ
HeqHoc: bsvar_occur phi1 dbi = true
HXfr1Fresh: evar_is_fresh_in (fresh_evar phi1^[svar:dbi↦phi2]) phi1^[svar:dbi↦phi2]
Hsub: is_subformula_of_ind phi2 phi1^[svar:dbi↦phi2]
HXfr1Fresh2: evar_is_fresh_in (fresh_evar phi1^[svar:dbi↦phi2]) phi2
Hinterp: eval ρe1' phi2 = eval ρ phi2
He1e1': update_svar_val X (eval ρe1' phi2) ρ = update_svar_val X (eval ρ phi2) ρ

fresh_evar phi1^[svar:dbi↦phi2] = evar_fresh (elements (free_evars phi1^[svar:dbi↦patt_free_svar X] ∪ free_evars phi2))
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (ex , phi1) (S dbi)
H: X ∉ free_svars phi1
c: M
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1^[svar:dbi↦patt_free_svar X]
Hfresh_subst: evar_is_fresh_in Xfr2' phi1^[svar:dbi↦patt_free_svar X] → evar_is_fresh_in (evar_fresh (elements (free_evars phi1^[svar:dbi↦ patt_free_svar X] ∪ free_evars phi2))) phi1^[svar:dbi↦patt_free_svar X] → eval (update_evar_val Xfr2' c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦Xfr2'} = eval (update_evar_val (evar_fresh (elements (free_evars phi1^[svar:dbi↦ patt_free_svar X] ∪ free_evars phi2))) c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦ evar_fresh (elements (free_evars phi1^[svar:dbi↦ patt_free_svar X] ∪ free_evars phi2))}
ρe1': Valuation
Heqρe1': ρe1' = update_evar_val (fresh_evar phi1^[svar:dbi↦phi2]) c ρ
ρe2': Valuation
Heqρe2': ρe2' = update_evar_val (evar_fresh (elements (free_evars phi1^[svar:dbi↦ patt_free_svar X] ∪ free_evars phi2))) c ρ
HeqHoc: bsvar_occur phi1 dbi = true
HXfr1Fresh: evar_is_fresh_in (fresh_evar phi1^[svar:dbi↦phi2]) phi1^[svar:dbi↦phi2]
Hsub: is_subformula_of_ind phi2 phi1^[svar:dbi↦phi2]
HXfr1Fresh2: evar_is_fresh_in (fresh_evar phi1^[svar:dbi↦phi2]) phi2
Hinterp: eval ρe1' phi2 = eval ρ phi2
He1e1': update_svar_val X (eval ρe1' phi2) ρ = update_svar_val X (eval ρ phi2) ρ

evar_fresh_s (free_evars phi1^[svar:dbi↦phi2]) = evar_fresh (elements (free_evars phi1^[svar:dbi↦patt_free_svar X] ∪ free_evars phi2))
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (ex , phi1) (S dbi)
H: X ∉ free_svars phi1
c: M
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1^[svar:dbi↦patt_free_svar X]
Hfresh_subst: evar_is_fresh_in Xfr2' phi1^[svar:dbi↦patt_free_svar X] → evar_is_fresh_in (evar_fresh (elements (free_evars phi1^[svar:dbi↦ patt_free_svar X] ∪ free_evars phi2))) phi1^[svar:dbi↦patt_free_svar X] → eval (update_evar_val Xfr2' c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦Xfr2'} = eval (update_evar_val (evar_fresh (elements (free_evars phi1^[svar:dbi↦ patt_free_svar X] ∪ free_evars phi2))) c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦ evar_fresh (elements (free_evars phi1^[svar:dbi↦ patt_free_svar X] ∪ free_evars phi2))}
ρe1': Valuation
Heqρe1': ρe1' = update_evar_val (fresh_evar phi1^[svar:dbi↦phi2]) c ρ
ρe2': Valuation
Heqρe2': ρe2' = update_evar_val (evar_fresh (elements (free_evars phi1^[svar:dbi↦ patt_free_svar X] ∪ free_evars phi2))) c ρ
HeqHoc: bsvar_occur phi1 dbi = true
HXfr1Fresh: evar_is_fresh_in (fresh_evar phi1^[svar:dbi↦phi2]) phi1^[svar:dbi↦phi2]
Hsub: is_subformula_of_ind phi2 phi1^[svar:dbi↦phi2]
HXfr1Fresh2: evar_is_fresh_in (fresh_evar phi1^[svar:dbi↦phi2]) phi2
Hinterp: eval ρe1' phi2 = eval ρ phi2
He1e1': update_svar_val X (eval ρe1' phi2) ρ = update_svar_val X (eval ρ phi2) ρ

evar_fresh_s (free_evars phi1 ∪ free_evars phi2) = evar_fresh (elements (free_evars phi1^[svar:dbi↦patt_free_svar X] ∪ free_evars phi2))
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (ex , phi1) (S dbi)
H: X ∉ free_svars phi1
c: M
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1^[svar:dbi↦patt_free_svar X]
Hfresh_subst: evar_is_fresh_in Xfr2' phi1^[svar:dbi↦patt_free_svar X] → evar_is_fresh_in (evar_fresh (elements (free_evars phi1^[svar:dbi↦ patt_free_svar X] ∪ free_evars phi2))) phi1^[svar:dbi↦patt_free_svar X] → eval (update_evar_val Xfr2' c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦Xfr2'} = eval (update_evar_val (evar_fresh (elements (free_evars phi1^[svar:dbi↦ patt_free_svar X] ∪ free_evars phi2))) c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦ evar_fresh (elements (free_evars phi1^[svar:dbi↦ patt_free_svar X] ∪ free_evars phi2))}
ρe1': Valuation
Heqρe1': ρe1' = update_evar_val (fresh_evar phi1^[svar:dbi↦phi2]) c ρ
ρe2': Valuation
Heqρe2': ρe2' = update_evar_val (evar_fresh (elements (free_evars phi1^[svar:dbi↦ patt_free_svar X] ∪ free_evars phi2))) c ρ
HeqHoc: bsvar_occur phi1 dbi = true
HXfr1Fresh: evar_is_fresh_in (fresh_evar phi1^[svar:dbi↦phi2]) phi1^[svar:dbi↦phi2]
Hsub: is_subformula_of_ind phi2 phi1^[svar:dbi↦phi2]
HXfr1Fresh2: evar_is_fresh_in (fresh_evar phi1^[svar:dbi↦phi2]) phi2
Hinterp: eval ρe1' phi2 = eval ρ phi2
He1e1': update_svar_val X (eval ρe1' phi2) ρ = update_svar_val X (eval ρ phi2) ρ
bsvar_occur phi1 dbi
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (ex , phi1) (S dbi)
H: X ∉ free_svars phi1
c: M
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1^[svar:dbi↦patt_free_svar X]
Hfresh_subst: evar_is_fresh_in Xfr2' phi1^[svar:dbi↦patt_free_svar X] → evar_is_fresh_in (evar_fresh (elements (free_evars phi1^[svar:dbi↦ patt_free_svar X] ∪ free_evars phi2))) phi1^[svar:dbi↦patt_free_svar X] → eval (update_evar_val Xfr2' c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦Xfr2'} = eval (update_evar_val (evar_fresh (elements (free_evars phi1^[svar:dbi↦ patt_free_svar X] ∪ free_evars phi2))) c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦ evar_fresh (elements (free_evars phi1^[svar:dbi↦ patt_free_svar X] ∪ free_evars phi2))}
ρe1': Valuation
Heqρe1': ρe1' = update_evar_val (fresh_evar phi1^[svar:dbi↦phi2]) c ρ
ρe2': Valuation
Heqρe2': ρe2' = update_evar_val (evar_fresh (elements (free_evars phi1^[svar:dbi↦ patt_free_svar X] ∪ free_evars phi2))) c ρ
HeqHoc: bsvar_occur phi1 dbi = true
HXfr1Fresh: evar_is_fresh_in (fresh_evar phi1^[svar:dbi↦phi2]) phi1^[svar:dbi↦phi2]
Hsub: is_subformula_of_ind phi2 phi1^[svar:dbi↦phi2]
HXfr1Fresh2: evar_is_fresh_in (fresh_evar phi1^[svar:dbi↦phi2]) phi2
Hinterp: eval ρe1' phi2 = eval ρ phi2
He1e1': update_svar_val X (eval ρe1' phi2) ρ = update_svar_val X (eval ρ phi2) ρ

evar_fresh_s (free_evars phi1 ∪ free_evars phi2) = evar_fresh (elements (free_evars phi1^{svar:dbi↦X} ∪ free_evars phi2))
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (ex , phi1) (S dbi)
H: X ∉ free_svars phi1
c: M
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1^[svar:dbi↦patt_free_svar X]
Hfresh_subst: evar_is_fresh_in Xfr2' phi1^[svar:dbi↦patt_free_svar X] → evar_is_fresh_in (evar_fresh (elements (free_evars phi1^[svar:dbi↦ patt_free_svar X] ∪ free_evars phi2))) phi1^[svar:dbi↦patt_free_svar X] → eval (update_evar_val Xfr2' c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦Xfr2'} = eval (update_evar_val (evar_fresh (elements (free_evars phi1^[svar:dbi↦ patt_free_svar X] ∪ free_evars phi2))) c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦ evar_fresh (elements (free_evars phi1^[svar:dbi↦ patt_free_svar X] ∪ free_evars phi2))}
ρe1': Valuation
Heqρe1': ρe1' = update_evar_val (fresh_evar phi1^[svar:dbi↦phi2]) c ρ
ρe2': Valuation
Heqρe2': ρe2' = update_evar_val (evar_fresh (elements (free_evars phi1^[svar:dbi↦ patt_free_svar X] ∪ free_evars phi2))) c ρ
HeqHoc: bsvar_occur phi1 dbi = true
HXfr1Fresh: evar_is_fresh_in (fresh_evar phi1^[svar:dbi↦phi2]) phi1^[svar:dbi↦phi2]
Hsub: is_subformula_of_ind phi2 phi1^[svar:dbi↦phi2]
HXfr1Fresh2: evar_is_fresh_in (fresh_evar phi1^[svar:dbi↦phi2]) phi2
Hinterp: eval ρe1' phi2 = eval ρ phi2
He1e1': update_svar_val X (eval ρe1' phi2) ρ = update_svar_val X (eval ρ phi2) ρ
bsvar_occur phi1 dbi
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (ex , phi1) (S dbi)
H: X ∉ free_svars phi1
c: M
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1^[svar:dbi↦patt_free_svar X]
Hfresh_subst: evar_is_fresh_in Xfr2' phi1^[svar:dbi↦patt_free_svar X] → evar_is_fresh_in (evar_fresh (elements (free_evars phi1^[svar:dbi↦ patt_free_svar X] ∪ free_evars phi2))) phi1^[svar:dbi↦patt_free_svar X] → eval (update_evar_val Xfr2' c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦Xfr2'} = eval (update_evar_val (evar_fresh (elements (free_evars phi1^[svar:dbi↦ patt_free_svar X] ∪ free_evars phi2))) c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦ evar_fresh (elements (free_evars phi1^[svar:dbi↦ patt_free_svar X] ∪ free_evars phi2))}
ρe1': Valuation
Heqρe1': ρe1' = update_evar_val (fresh_evar phi1^[svar:dbi↦phi2]) c ρ
ρe2': Valuation
Heqρe2': ρe2' = update_evar_val (evar_fresh (elements (free_evars phi1^[svar:dbi↦ patt_free_svar X] ∪ free_evars phi2))) c ρ
HeqHoc: bsvar_occur phi1 dbi = true
HXfr1Fresh: evar_is_fresh_in (fresh_evar phi1^[svar:dbi↦phi2]) phi1^[svar:dbi↦phi2]
Hsub: is_subformula_of_ind phi2 phi1^[svar:dbi↦phi2]
HXfr1Fresh2: evar_is_fresh_in (fresh_evar phi1^[svar:dbi↦phi2]) phi2
Hinterp: eval ρe1' phi2 = eval ρ phi2
He1e1': update_svar_val X (eval ρe1' phi2) ρ = update_svar_val X (eval ρ phi2) ρ

evar_fresh_s (free_evars phi1 ∪ free_evars phi2) = evar_fresh (elements (free_evars phi1 ∪ free_evars phi2))
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (ex , phi1) (S dbi)
H: X ∉ free_svars phi1
c: M
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1^[svar:dbi↦patt_free_svar X]
Hfresh_subst: evar_is_fresh_in Xfr2' phi1^[svar:dbi↦patt_free_svar X] → evar_is_fresh_in (evar_fresh (elements (free_evars phi1^[svar:dbi↦ patt_free_svar X] ∪ free_evars phi2))) phi1^[svar:dbi↦patt_free_svar X] → eval (update_evar_val Xfr2' c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦Xfr2'} = eval (update_evar_val (evar_fresh (elements (free_evars phi1^[svar:dbi↦ patt_free_svar X] ∪ free_evars phi2))) c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦ evar_fresh (elements (free_evars phi1^[svar:dbi↦ patt_free_svar X] ∪ free_evars phi2))}
ρe1': Valuation
Heqρe1': ρe1' = update_evar_val (fresh_evar phi1^[svar:dbi↦phi2]) c ρ
ρe2': Valuation
Heqρe2': ρe2' = update_evar_val (evar_fresh (elements (free_evars phi1^[svar:dbi↦ patt_free_svar X] ∪ free_evars phi2))) c ρ
HeqHoc: bsvar_occur phi1 dbi = true
HXfr1Fresh: evar_is_fresh_in (fresh_evar phi1^[svar:dbi↦phi2]) phi1^[svar:dbi↦phi2]
Hsub: is_subformula_of_ind phi2 phi1^[svar:dbi↦phi2]
HXfr1Fresh2: evar_is_fresh_in (fresh_evar phi1^[svar:dbi↦phi2]) phi2
Hinterp: eval ρe1' phi2 = eval ρ phi2
He1e1': update_svar_val X (eval ρe1' phi2) ρ = update_svar_val X (eval ρ phi2) ρ
bsvar_occur phi1 dbi
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (ex , phi1) (S dbi)
H: X ∉ free_svars phi1
c: M
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1^[svar:dbi↦patt_free_svar X]
Hfresh_subst: evar_is_fresh_in Xfr2' phi1^[svar:dbi↦patt_free_svar X] → evar_is_fresh_in (evar_fresh (elements (free_evars phi1^[svar:dbi↦ patt_free_svar X] ∪ free_evars phi2))) phi1^[svar:dbi↦patt_free_svar X] → eval (update_evar_val Xfr2' c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦Xfr2'} = eval (update_evar_val (evar_fresh (elements (free_evars phi1^[svar:dbi↦ patt_free_svar X] ∪ free_evars phi2))) c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦ evar_fresh (elements (free_evars phi1^[svar:dbi↦ patt_free_svar X] ∪ free_evars phi2))}
ρe1': Valuation
Heqρe1': ρe1' = update_evar_val (fresh_evar phi1^[svar:dbi↦phi2]) c ρ
ρe2': Valuation
Heqρe2': ρe2' = update_evar_val (evar_fresh (elements (free_evars phi1^[svar:dbi↦ patt_free_svar X] ∪ free_evars phi2))) c ρ
HeqHoc: bsvar_occur phi1 dbi = true
HXfr1Fresh: evar_is_fresh_in (fresh_evar phi1^[svar:dbi↦phi2]) phi1^[svar:dbi↦phi2]
Hsub: is_subformula_of_ind phi2 phi1^[svar:dbi↦phi2]
HXfr1Fresh2: evar_is_fresh_in (fresh_evar phi1^[svar:dbi↦phi2]) phi2
Hinterp: eval ρe1' phi2 = eval ρ phi2
He1e1': update_svar_val X (eval ρe1' phi2) ρ = update_svar_val X (eval ρ phi2) ρ

bsvar_occur phi1 dbi
auto.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (ex , phi1) (S dbi)
H: X ∉ free_svars phi1
c: M
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1^[svar:dbi↦patt_free_svar X]
Xu: evar
Hfresh_subst: evar_is_fresh_in Xfr2' phi1^[svar:dbi↦patt_free_svar X] → evar_is_fresh_in Xu phi1^[svar:dbi↦patt_free_svar X] → eval (update_evar_val Xfr2' c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦Xfr2'} = eval (update_evar_val Xu c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦Xu}
HeqXu: Xu = evar_fresh (elements (free_evars phi1^[svar:dbi↦ patt_free_svar X] ∪ free_evars phi2))
ρe1': Valuation
Xfr1: evar
HeqXfr1: Xfr1 = fresh_evar phi1^[svar:dbi↦phi2]
Heqρe1': ρe1' = update_evar_val Xfr1 c ρ
ρe2': Valuation
Heqρe2': ρe2' = update_evar_val Xu c ρ
HeqHoc: bsvar_occur phi1 dbi = true
HXfr1Fresh: evar_is_fresh_in Xfr1 phi1^[svar:dbi↦phi2]
Hsub: is_subformula_of_ind phi2 phi1^[svar:dbi↦phi2]
HXfr1Fresh2: evar_is_fresh_in Xfr1 phi2
Hinterp: eval ρe1' phi2 = eval ρ phi2
He1e1': update_svar_val X (eval ρe1' phi2) ρ = update_svar_val X (eval ρ phi2) ρ
HXu: Xfr1 = Xu

eval ρe1' phi1^{evar:0↦Xfr1}^[svar:dbi↦phi2] = eval (update_evar_val Xu c (update_svar_val X (eval ρe1' phi2) ρ)) phi1^{evar:0↦Xu}^[svar:dbi↦patt_free_svar X]
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (ex , phi1) (S dbi)
H: X ∉ free_svars phi1
c: M
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1^[svar:dbi↦patt_free_svar X]
Xu: evar
Hfresh_subst: evar_is_fresh_in Xfr2' phi1^[svar:dbi↦patt_free_svar X] → evar_is_fresh_in Xu phi1^[svar:dbi↦patt_free_svar X] → eval (update_evar_val Xfr2' c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦Xfr2'} = eval (update_evar_val Xu c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦Xu}
HeqXu: Xu = evar_fresh (elements (free_evars phi1^[svar:dbi↦ patt_free_svar X] ∪ free_evars phi2))
ρe1': Valuation
Xfr1: evar
HeqXfr1: Xu = fresh_evar phi1^[svar:dbi↦phi2]
Heqρe1': ρe1' = update_evar_val Xu c ρ
ρe2': Valuation
Heqρe2': ρe2' = update_evar_val Xu c ρ
HeqHoc: bsvar_occur phi1 dbi = true
HXfr1Fresh: evar_is_fresh_in Xu phi1^[svar:dbi↦phi2]
Hsub: is_subformula_of_ind phi2 phi1^[svar:dbi↦phi2]
HXfr1Fresh2: evar_is_fresh_in Xu phi2
Hinterp: eval ρe1' phi2 = eval ρ phi2
He1e1': update_svar_val X (eval ρe1' phi2) ρ = update_svar_val X (eval ρ phi2) ρ
HXu: Xfr1 = Xu

eval ρe1' phi1^{evar:0↦Xu}^[svar:dbi↦phi2] = eval (update_evar_val Xu c (update_svar_val X (eval ρe1' phi2) ρ)) phi1^{evar:0↦Xu}^[svar:dbi↦patt_free_svar X]
(* assert (He1e2 : ρe1' = ρe2'). { subst. auto. } rewrite <- He1e2. *)
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (ex , phi1) (S dbi)
H: X ∉ free_svars phi1
c: M
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1^[svar:dbi↦patt_free_svar X]
Xu: evar
Hfresh_subst: evar_is_fresh_in Xfr2' phi1^[svar:dbi↦patt_free_svar X] → evar_is_fresh_in Xu phi1^[svar:dbi↦patt_free_svar X] → eval (update_evar_val Xfr2' c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦Xfr2'} = eval (update_evar_val Xu c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦Xu}
HeqXu: Xu = evar_fresh (elements (free_evars phi1^[svar:dbi↦ patt_free_svar X] ∪ free_evars phi2))
ρe1': Valuation
Xfr1: evar
HeqXfr1: Xu = fresh_evar phi1^[svar:dbi↦phi2]
Heqρe1': ρe1' = update_evar_val Xu c ρ
ρe2': Valuation
Heqρe2': ρe2' = update_evar_val Xu c ρ
HeqHoc: bsvar_occur phi1 dbi = true
HXfr1Fresh: evar_is_fresh_in Xu phi1^[svar:dbi↦phi2]
Hsub: is_subformula_of_ind phi2 phi1^[svar:dbi↦phi2]
HXfr1Fresh2: evar_is_fresh_in Xu phi2
Hinterp: eval ρe1' phi2 = eval ρ phi2
He1e1': update_svar_val X (eval ρe1' phi2) ρ = update_svar_val X (eval ρ phi2) ρ
HXu: Xfr1 = Xu

eval ρe1' phi1^{evar:0↦Xu}^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρe1' phi2) (update_evar_val Xu c ρ)) phi1^{evar:0↦Xu}^[svar:dbi↦patt_free_svar X]
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (ex , phi1) (S dbi)
H: X ∉ free_svars phi1
c: M
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1^[svar:dbi↦patt_free_svar X]
Xu: evar
Hfresh_subst: evar_is_fresh_in Xfr2' phi1^[svar:dbi↦patt_free_svar X] → evar_is_fresh_in Xu phi1^[svar:dbi↦patt_free_svar X] → eval (update_evar_val Xfr2' c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦Xfr2'} = eval (update_evar_val Xu c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦Xu}
HeqXu: Xu = evar_fresh (elements (free_evars phi1^[svar:dbi↦ patt_free_svar X] ∪ free_evars phi2))
ρe1': Valuation
Xfr1: evar
HeqXfr1: Xu = fresh_evar phi1^[svar:dbi↦phi2]
Heqρe1': ρe1' = update_evar_val Xu c ρ
ρe2': Valuation
Heqρe2': ρe2' = update_evar_val Xu c ρ
HeqHoc: bsvar_occur phi1 dbi = true
HXfr1Fresh: evar_is_fresh_in Xu phi1^[svar:dbi↦phi2]
Hsub: is_subformula_of_ind phi2 phi1^[svar:dbi↦phi2]
HXfr1Fresh2: evar_is_fresh_in Xu phi2
Hinterp: eval ρe1' phi2 = eval ρ phi2
He1e1': update_svar_val X (eval ρe1' phi2) ρ = update_svar_val X (eval ρ phi2) ρ
HXu: Xfr1 = Xu

eval ρe1' phi1^{evar:0↦Xu}^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρe1' phi2) ρe1') phi1^{evar:0↦Xu}^[svar:dbi↦patt_free_svar X]
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (ex , phi1) (S dbi)
H: X ∉ free_svars phi1
c: M
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1^[svar:dbi↦patt_free_svar X]
Xu: evar
Hfresh_subst: evar_is_fresh_in Xfr2' phi1^[svar:dbi↦patt_free_svar X] → evar_is_fresh_in Xu phi1^[svar:dbi↦patt_free_svar X] → eval (update_evar_val Xfr2' c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦Xfr2'} = eval (update_evar_val Xu c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦Xu}
HeqXu: Xu = evar_fresh (elements (free_evars phi1^[svar:dbi↦ patt_free_svar X] ∪ free_evars phi2))
ρe1': Valuation
Xfr1: evar
HeqXfr1: Xu = fresh_evar phi1^[svar:dbi↦phi2]
Heqρe1': ρe1' = update_evar_val Xu c ρ
ρe2': Valuation
Heqρe2': ρe2' = update_evar_val Xu c ρ
HeqHoc: bsvar_occur phi1 dbi = true
HXfr1Fresh: evar_is_fresh_in Xu phi1^[svar:dbi↦phi2]
Hsub: is_subformula_of_ind phi2 phi1^[svar:dbi↦phi2]
HXfr1Fresh2: evar_is_fresh_in Xu phi2
Hinterp: eval ρe1' phi2 = eval ρ phi2
He1e1': update_svar_val X (eval ρe1' phi2) ρ = update_svar_val X (eval ρ phi2) ρ
HXu: Xfr1 = Xu

eval ρe1' phi1^{evar:0↦Xu}^[svar:dbi↦phi2] = eval ρe1' phi1^{evar:0↦Xu}^[svar:dbi↦phi2]
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (ex , phi1) (S dbi)
H: X ∉ free_svars phi1
c: M
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1^[svar:dbi↦patt_free_svar X]
Xu: evar
Hfresh_subst: evar_is_fresh_in Xfr2' phi1^[svar:dbi↦patt_free_svar X] → evar_is_fresh_in Xu phi1^[svar:dbi↦patt_free_svar X] → eval (update_evar_val Xfr2' c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦Xfr2'} = eval (update_evar_val Xu c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦Xu}
HeqXu: Xu = evar_fresh (elements (free_evars phi1^[svar:dbi↦ patt_free_svar X] ∪ free_evars phi2))
ρe1': Valuation
Xfr1: evar
HeqXfr1: Xu = fresh_evar phi1^[svar:dbi↦phi2]
Heqρe1': ρe1' = update_evar_val Xu c ρ
ρe2': Valuation
Heqρe2': ρe2' = update_evar_val Xu c ρ
HeqHoc: bsvar_occur phi1 dbi = true
HXfr1Fresh: evar_is_fresh_in Xu phi1^[svar:dbi↦phi2]
Hsub: is_subformula_of_ind phi2 phi1^[svar:dbi↦phi2]
HXfr1Fresh2: evar_is_fresh_in Xu phi2
Hinterp: eval ρe1' phi2 = eval ρ phi2
He1e1': update_svar_val X (eval ρe1' phi2) ρ = update_svar_val X (eval ρ phi2) ρ
HXu: Xfr1 = Xu
size phi1^{evar:0↦Xu} ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (ex , phi1) (S dbi)
H: X ∉ free_svars phi1
c: M
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1^[svar:dbi↦patt_free_svar X]
Xu: evar
Hfresh_subst: evar_is_fresh_in Xfr2' phi1^[svar:dbi↦patt_free_svar X] → evar_is_fresh_in Xu phi1^[svar:dbi↦patt_free_svar X] → eval (update_evar_val Xfr2' c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦Xfr2'} = eval (update_evar_val Xu c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦Xu}
HeqXu: Xu = evar_fresh (elements (free_evars phi1^[svar:dbi↦ patt_free_svar X] ∪ free_evars phi2))
ρe1': Valuation
Xfr1: evar
HeqXfr1: Xu = fresh_evar phi1^[svar:dbi↦phi2]
Heqρe1': ρe1' = update_evar_val Xu c ρ
ρe2': Valuation
Heqρe2': ρe2' = update_evar_val Xu c ρ
HeqHoc: bsvar_occur phi1 dbi = true
HXfr1Fresh: evar_is_fresh_in Xu phi1^[svar:dbi↦phi2]
Hsub: is_subformula_of_ind phi2 phi1^[svar:dbi↦phi2]
HXfr1Fresh2: evar_is_fresh_in Xu phi2
Hinterp: eval ρe1' phi2 = eval ρ phi2
He1e1': update_svar_val X (eval ρe1' phi2) ρ = update_svar_val X (eval ρ phi2) ρ
HXu: Xfr1 = Xu
well_formed_closed phi2
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (ex , phi1) (S dbi)
H: X ∉ free_svars phi1
c: M
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1^[svar:dbi↦patt_free_svar X]
Xu: evar
Hfresh_subst: evar_is_fresh_in Xfr2' phi1^[svar:dbi↦patt_free_svar X] → evar_is_fresh_in Xu phi1^[svar:dbi↦patt_free_svar X] → eval (update_evar_val Xfr2' c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦Xfr2'} = eval (update_evar_val Xu c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦Xu}
HeqXu: Xu = evar_fresh (elements (free_evars phi1^[svar:dbi↦ patt_free_svar X] ∪ free_evars phi2))
ρe1': Valuation
Xfr1: evar
HeqXfr1: Xu = fresh_evar phi1^[svar:dbi↦phi2]
Heqρe1': ρe1' = update_evar_val Xu c ρ
ρe2': Valuation
Heqρe2': ρe2' = update_evar_val Xu c ρ
HeqHoc: bsvar_occur phi1 dbi = true
HXfr1Fresh: evar_is_fresh_in Xu phi1^[svar:dbi↦phi2]
Hsub: is_subformula_of_ind phi2 phi1^[svar:dbi↦phi2]
HXfr1Fresh2: evar_is_fresh_in Xu phi2
Hinterp: eval ρe1' phi2 = eval ρ phi2
He1e1': update_svar_val X (eval ρe1' phi2) ρ = update_svar_val X (eval ρ phi2) ρ
HXu: Xfr1 = Xu
well_formed_closed_mu_aux phi1^{evar:0↦Xu} (S dbi)
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (ex , phi1) (S dbi)
H: X ∉ free_svars phi1
c: M
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1^[svar:dbi↦patt_free_svar X]
Xu: evar
Hfresh_subst: evar_is_fresh_in Xfr2' phi1^[svar:dbi↦patt_free_svar X] → evar_is_fresh_in Xu phi1^[svar:dbi↦patt_free_svar X] → eval (update_evar_val Xfr2' c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦Xfr2'} = eval (update_evar_val Xu c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦Xu}
HeqXu: Xu = evar_fresh (elements (free_evars phi1^[svar:dbi↦ patt_free_svar X] ∪ free_evars phi2))
ρe1': Valuation
Xfr1: evar
HeqXfr1: Xu = fresh_evar phi1^[svar:dbi↦phi2]
Heqρe1': ρe1' = update_evar_val Xu c ρ
ρe2': Valuation
Heqρe2': ρe2' = update_evar_val Xu c ρ
HeqHoc: bsvar_occur phi1 dbi = true
HXfr1Fresh: evar_is_fresh_in Xu phi1^[svar:dbi↦phi2]
Hsub: is_subformula_of_ind phi2 phi1^[svar:dbi↦phi2]
HXfr1Fresh2: evar_is_fresh_in Xu phi2
Hinterp: eval ρe1' phi2 = eval ρ phi2
He1e1': update_svar_val X (eval ρe1' phi2) ρ = update_svar_val X (eval ρ phi2) ρ
HXu: Xfr1 = Xu
X ∉ free_svars phi1^{evar:0↦Xu}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (ex , phi1) (S dbi)
H: X ∉ free_svars phi1
c: M
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1^[svar:dbi↦patt_free_svar X]
Xu: evar
Hfresh_subst: evar_is_fresh_in Xfr2' phi1^[svar:dbi↦patt_free_svar X] → evar_is_fresh_in Xu phi1^[svar:dbi↦patt_free_svar X] → eval (update_evar_val Xfr2' c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦Xfr2'} = eval (update_evar_val Xu c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦Xu}
HeqXu: Xu = evar_fresh (elements (free_evars phi1^[svar:dbi↦ patt_free_svar X] ∪ free_evars phi2))
ρe1': Valuation
Xfr1: evar
HeqXfr1: Xu = fresh_evar phi1^[svar:dbi↦phi2]
Heqρe1': ρe1' = update_evar_val Xu c ρ
ρe2': Valuation
Heqρe2': ρe2' = update_evar_val Xu c ρ
HeqHoc: bsvar_occur phi1 dbi = true
HXfr1Fresh: evar_is_fresh_in Xu phi1^[svar:dbi↦phi2]
Hsub: is_subformula_of_ind phi2 phi1^[svar:dbi↦phi2]
HXfr1Fresh2: evar_is_fresh_in Xu phi2
Hinterp: eval ρe1' phi2 = eval ρ phi2
He1e1': update_svar_val X (eval ρe1' phi2) ρ = update_svar_val X (eval ρ phi2) ρ
HXu: Xfr1 = Xu

eval ρe1' phi1^{evar:0↦Xu}^[svar:dbi↦phi2] = eval ρe1' phi1^{evar:0↦Xu}^[svar:dbi↦phi2]
reflexivity.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (ex , phi1) (S dbi)
H: X ∉ free_svars phi1
c: M
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1^[svar:dbi↦patt_free_svar X]
Xu: evar
Hfresh_subst: evar_is_fresh_in Xfr2' phi1^[svar:dbi↦patt_free_svar X] → evar_is_fresh_in Xu phi1^[svar:dbi↦patt_free_svar X] → eval (update_evar_val Xfr2' c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦Xfr2'} = eval (update_evar_val Xu c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦Xu}
HeqXu: Xu = evar_fresh (elements (free_evars phi1^[svar:dbi↦ patt_free_svar X] ∪ free_evars phi2))
ρe1': Valuation
Xfr1: evar
HeqXfr1: Xu = fresh_evar phi1^[svar:dbi↦phi2]
Heqρe1': ρe1' = update_evar_val Xu c ρ
ρe2': Valuation
Heqρe2': ρe2' = update_evar_val Xu c ρ
HeqHoc: bsvar_occur phi1 dbi = true
HXfr1Fresh: evar_is_fresh_in Xu phi1^[svar:dbi↦phi2]
Hsub: is_subformula_of_ind phi2 phi1^[svar:dbi↦phi2]
HXfr1Fresh2: evar_is_fresh_in Xu phi2
Hinterp: eval ρe1' phi2 = eval ρ phi2
He1e1': update_svar_val X (eval ρe1' phi2) ρ = update_svar_val X (eval ρ phi2) ρ
HXu: Xfr1 = Xu

size phi1^{evar:0↦Xu} ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (ex , phi1) (S dbi)
H: X ∉ free_svars phi1
c: M
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1^[svar:dbi↦patt_free_svar X]
Xu: evar
Hfresh_subst: evar_is_fresh_in Xfr2' phi1^[svar:dbi↦patt_free_svar X] → evar_is_fresh_in Xu phi1^[svar:dbi↦patt_free_svar X] → eval (update_evar_val Xfr2' c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦Xfr2'} = eval (update_evar_val Xu c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦Xu}
HeqXu: Xu = evar_fresh (elements (free_evars phi1^[svar:dbi↦ patt_free_svar X] ∪ free_evars phi2))
ρe1': Valuation
Xfr1: evar
HeqXfr1: Xu = fresh_evar phi1^[svar:dbi↦phi2]
Heqρe1': ρe1' = update_evar_val Xu c ρ
ρe2': Valuation
Heqρe2': ρe2' = update_evar_val Xu c ρ
HeqHoc: bsvar_occur phi1 dbi = true
HXfr1Fresh: evar_is_fresh_in Xu phi1^[svar:dbi↦phi2]
Hsub: is_subformula_of_ind phi2 phi1^[svar:dbi↦phi2]
HXfr1Fresh2: evar_is_fresh_in Xu phi2
Hinterp: eval ρe1' phi2 = eval ρ phi2
He1e1': update_svar_val X (eval ρe1' phi2) ρ = update_svar_val X (eval ρ phi2) ρ
HXu: Xfr1 = Xu

size phi1 ≤ sz
lia.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (ex , phi1) (S dbi)
H: X ∉ free_svars phi1
c: M
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1^[svar:dbi↦patt_free_svar X]
Xu: evar
Hfresh_subst: evar_is_fresh_in Xfr2' phi1^[svar:dbi↦patt_free_svar X] → evar_is_fresh_in Xu phi1^[svar:dbi↦patt_free_svar X] → eval (update_evar_val Xfr2' c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦Xfr2'} = eval (update_evar_val Xu c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦Xu}
HeqXu: Xu = evar_fresh (elements (free_evars phi1^[svar:dbi↦ patt_free_svar X] ∪ free_evars phi2))
ρe1': Valuation
Xfr1: evar
HeqXfr1: Xu = fresh_evar phi1^[svar:dbi↦phi2]
Heqρe1': ρe1' = update_evar_val Xu c ρ
ρe2': Valuation
Heqρe2': ρe2' = update_evar_val Xu c ρ
HeqHoc: bsvar_occur phi1 dbi = true
HXfr1Fresh: evar_is_fresh_in Xu phi1^[svar:dbi↦phi2]
Hsub: is_subformula_of_ind phi2 phi1^[svar:dbi↦phi2]
HXfr1Fresh2: evar_is_fresh_in Xu phi2
Hinterp: eval ρe1' phi2 = eval ρ phi2
He1e1': update_svar_val X (eval ρe1' phi2) ρ = update_svar_val X (eval ρ phi2) ρ
HXu: Xfr1 = Xu

well_formed_closed phi2
auto.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (ex , phi1) (S dbi)
H: X ∉ free_svars phi1
c: M
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1^[svar:dbi↦patt_free_svar X]
Xu: evar
Hfresh_subst: evar_is_fresh_in Xfr2' phi1^[svar:dbi↦patt_free_svar X] → evar_is_fresh_in Xu phi1^[svar:dbi↦patt_free_svar X] → eval (update_evar_val Xfr2' c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦Xfr2'} = eval (update_evar_val Xu c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦Xu}
HeqXu: Xu = evar_fresh (elements (free_evars phi1^[svar:dbi↦ patt_free_svar X] ∪ free_evars phi2))
ρe1': Valuation
Xfr1: evar
HeqXfr1: Xu = fresh_evar phi1^[svar:dbi↦phi2]
Heqρe1': ρe1' = update_evar_val Xu c ρ
ρe2': Valuation
Heqρe2': ρe2' = update_evar_val Xu c ρ
HeqHoc: bsvar_occur phi1 dbi = true
HXfr1Fresh: evar_is_fresh_in Xu phi1^[svar:dbi↦phi2]
Hsub: is_subformula_of_ind phi2 phi1^[svar:dbi↦phi2]
HXfr1Fresh2: evar_is_fresh_in Xu phi2
Hinterp: eval ρe1' phi2 = eval ρ phi2
He1e1': update_svar_val X (eval ρe1' phi2) ρ = update_svar_val X (eval ρ phi2) ρ
HXu: Xfr1 = Xu

well_formed_closed_mu_aux phi1^{evar:0↦Xu} (S dbi)
now apply wfc_mu_aux_body_ex_imp1.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (ex , phi1) (S dbi)
H: X ∉ free_svars phi1
c: M
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1^[svar:dbi↦patt_free_svar X]
Xu: evar
Hfresh_subst: evar_is_fresh_in Xfr2' phi1^[svar:dbi↦patt_free_svar X] → evar_is_fresh_in Xu phi1^[svar:dbi↦patt_free_svar X] → eval (update_evar_val Xfr2' c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦Xfr2'} = eval (update_evar_val Xu c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦Xu}
HeqXu: Xu = evar_fresh (elements (free_evars phi1^[svar:dbi↦ patt_free_svar X] ∪ free_evars phi2))
ρe1': Valuation
Xfr1: evar
HeqXfr1: Xu = fresh_evar phi1^[svar:dbi↦phi2]
Heqρe1': ρe1' = update_evar_val Xu c ρ
ρe2': Valuation
Heqρe2': ρe2' = update_evar_val Xu c ρ
HeqHoc: bsvar_occur phi1 dbi = true
HXfr1Fresh: evar_is_fresh_in Xu phi1^[svar:dbi↦phi2]
Hsub: is_subformula_of_ind phi2 phi1^[svar:dbi↦phi2]
HXfr1Fresh2: evar_is_fresh_in Xu phi2
Hinterp: eval ρe1' phi2 = eval ρ phi2
He1e1': update_svar_val X (eval ρe1' phi2) ρ = update_svar_val X (eval ρ phi2) ρ
HXu: Xfr1 = Xu

X ∉ free_svars phi1^{evar:0↦Xu}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (ex , phi1) (S dbi)
H: X ∉ free_svars phi1
c: M
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1^[svar:dbi↦patt_free_svar X]
Xu: evar
Hfresh_subst: evar_is_fresh_in Xfr2' phi1^[svar:dbi↦patt_free_svar X] → evar_is_fresh_in Xu phi1^[svar:dbi↦patt_free_svar X] → eval (update_evar_val Xfr2' c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦Xfr2'} = eval (update_evar_val Xu c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦Xu}
HeqXu: Xu = evar_fresh (elements (free_evars phi1^[svar:dbi↦ patt_free_svar X] ∪ free_evars phi2))
ρe1': Valuation
Xfr1: evar
HeqXfr1: Xu = fresh_evar phi1^[svar:dbi↦phi2]
Heqρe1': ρe1' = update_evar_val Xu c ρ
ρe2': Valuation
Heqρe2': ρe2' = update_evar_val Xu c ρ
HeqHoc: bsvar_occur phi1 dbi = true
HXfr1Fresh: evar_is_fresh_in Xu phi1^[svar:dbi↦phi2]
Hsub: is_subformula_of_ind phi2 phi1^[svar:dbi↦phi2]
HXfr1Fresh2: evar_is_fresh_in Xu phi2
Hinterp: eval ρe1' phi2 = eval ρ phi2
He1e1': update_svar_val X (eval ρe1' phi2) ρ = update_svar_val X (eval ρ phi2) ρ
HXu: Xfr1 = Xu

X ∉ free_svars phi1
auto.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (ex , phi1) (S dbi)
H: X ∉ free_svars phi1
c: M
phi1': Pattern
Heqphi1': phi1' = phi1^[svar:dbi↦patt_free_svar X]
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1'
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi1' ∪ free_evars phi2))
ρ2': Valuation
Heqρ2': ρ2' = update_svar_val X (eval ρ phi2) ρ
Hfresh_subst: evar_is_fresh_in Xfr2' phi1' → evar_is_fresh_in Xu phi1' → eval (update_evar_val Xfr2' c ρ2') phi1'^{evar:0↦Xfr2'} = eval (update_evar_val Xu c ρ2') phi1'^{evar:0↦Xu}
ρe1': Valuation
Xfr1: evar
HeqXfr1: Xfr1 = fresh_evar phi1^[svar:dbi↦phi2]
Heqρe1': ρe1' = update_evar_val Xfr1 c ρ
ρe2': Valuation
Heqρe2': ρe2' = update_evar_val Xu c ρ
HeqHoc: false = bsvar_occur phi1 dbi

eval ρe1' phi1^{evar:0↦Xfr1}^[svar:dbi↦phi2] = eval (update_evar_val Xu c ρ2') phi1'^{evar:0↦Xu}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (ex , phi1) (S dbi)
H: X ∉ free_svars phi1
c: M
phi1': Pattern
Heqphi1': phi1' = phi1^[svar:dbi↦patt_free_svar X]
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1'
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi1' ∪ free_evars phi2))
ρ2': Valuation
Heqρ2': ρ2' = update_svar_val X (eval ρ phi2) ρ
Hfresh_subst: evar_is_fresh_in Xfr2' phi1' → evar_is_fresh_in Xu phi1' → eval (update_evar_val Xfr2' c ρ2') phi1'^{evar:0↦Xfr2'} = eval (update_evar_val Xu c ρ2') phi1'^{evar:0↦Xu}
ρe1': Valuation
Xfr1: evar
HeqXfr1: Xfr1 = fresh_evar phi1^[svar:dbi↦phi2]
Heqρe1': ρe1' = update_evar_val Xfr1 c ρ
ρe2': Valuation
Heqρe2': ρe2' = update_evar_val Xu c ρ
HeqHoc, HeqHoc': false = bsvar_occur phi1 dbi

eval ρe1' phi1^{evar:0↦Xfr1}^[svar:dbi↦phi2] = eval (update_evar_val Xu c ρ2') phi1'^{evar:0↦Xu}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (ex , phi1) (S dbi)
H: X ∉ free_svars phi1
c: M
phi1': Pattern
Heqphi1': phi1' = phi1^[svar:dbi↦patt_free_svar X]
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1'
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi1' ∪ free_evars phi2))
ρ2': Valuation
Heqρ2': ρ2' = update_svar_val X (eval ρ phi2) ρ
Hfresh_subst: evar_is_fresh_in Xfr2' phi1' → evar_is_fresh_in Xu phi1' → eval (update_evar_val Xfr2' c ρ2') phi1'^{evar:0↦Xfr2'} = eval (update_evar_val Xu c ρ2') phi1'^{evar:0↦Xu}
ρe1': Valuation
Xfr1: evar
HeqXfr1: Xfr1 = fresh_evar phi1^[svar:dbi↦phi2]
Heqρe1': ρe1' = update_evar_val Xfr1 c ρ
ρe2': Valuation
Heqρe2': ρe2' = update_evar_val Xu c ρ
HeqHoc, HeqHoc': false = bsvar_occur phi1 dbi

eval ρe1' phi1^{evar:0↦Xfr1} = eval (update_evar_val Xu c ρ2') phi1'^{evar:0↦Xu}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (ex , phi1) (S dbi)
H: X ∉ free_svars phi1
c: M
phi1': Pattern
Heqphi1': phi1' = phi1^[svar:dbi↦patt_free_svar X]
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1'
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi1' ∪ free_evars phi2))
ρ2': Valuation
Heqρ2': ρ2' = update_svar_val X (eval ρ phi2) ρ
Hfresh_subst: evar_is_fresh_in Xfr2' phi1' → evar_is_fresh_in Xu phi1' → eval (update_evar_val Xfr2' c ρ2') phi1'^{evar:0↦Xfr2'} = eval (update_evar_val Xu c ρ2') phi1'^{evar:0↦Xu}
ρe1': Valuation
Xfr1: evar
HeqXfr1: Xfr1 = fresh_evar phi1^[svar:dbi↦phi2]
Heqρe1': ρe1' = update_evar_val Xfr1 c ρ
ρe2': Valuation
Heqρe2': ρe2' = update_evar_val Xu c ρ
HeqHoc, HeqHoc': false = bsvar_occur phi1 dbi
well_formed_closed_mu_aux phi1^{evar:0↦Xfr1} dbi
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (ex , phi1) (S dbi)
H: X ∉ free_svars phi1
c: M
phi1': Pattern
Heqphi1': phi1' = phi1^[svar:dbi↦patt_free_svar X]
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1'
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi1' ∪ free_evars phi2))
ρ2': Valuation
Heqρ2': ρ2' = update_svar_val X (eval ρ phi2) ρ
Hfresh_subst: evar_is_fresh_in Xfr2' phi1' → evar_is_fresh_in Xu phi1' → eval (update_evar_val Xfr2' c ρ2') phi1'^{evar:0↦Xfr2'} = eval (update_evar_val Xu c ρ2') phi1'^{evar:0↦Xu}
ρe1': Valuation
Xfr1: evar
HeqXfr1: Xfr1 = fresh_evar phi1^[svar:dbi↦phi2]
Heqρe1': ρe1' = update_evar_val Xfr1 c ρ
ρe2': Valuation
Heqρe2': ρe2' = update_evar_val Xu c ρ
HeqHoc, HeqHoc': false = bsvar_occur phi1 dbi

well_formed_closed_mu_aux phi1^{evar:0↦Xfr1} dbi
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (ex , phi1) (S dbi)
H: X ∉ free_svars phi1
c: M
phi1': Pattern
Heqphi1': phi1' = phi1^[svar:dbi↦patt_free_svar X]
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1'
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi1' ∪ free_evars phi2))
ρ2': Valuation
Heqρ2': ρ2' = update_svar_val X (eval ρ phi2) ρ
Hfresh_subst: evar_is_fresh_in Xfr2' phi1' → evar_is_fresh_in Xu phi1' → eval (update_evar_val Xfr2' c ρ2') phi1'^{evar:0↦Xfr2'} = eval (update_evar_val Xu c ρ2') phi1'^{evar:0↦Xu}
ρe1': Valuation
Xfr1: evar
HeqXfr1: Xfr1 = fresh_evar phi1^[svar:dbi↦phi2]
Heqρe1': ρe1' = update_evar_val Xfr1 c ρ
ρe2': Valuation
Heqρe2': ρe2' = update_evar_val Xu c ρ
HeqHoc, HeqHoc': false = bsvar_occur phi1 dbi

well_formed_closed_mu_aux phi1 dbi = true
apply wfc_mu_lower in Hwfphi1; wf_auto2.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (ex , phi1) (S dbi)
H: X ∉ free_svars phi1
c: M
phi1': Pattern
Heqphi1': phi1' = phi1^[svar:dbi↦patt_free_svar X]
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1'
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi1' ∪ free_evars phi2))
ρ2': Valuation
Heqρ2': ρ2' = update_svar_val X (eval ρ phi2) ρ
Hfresh_subst: evar_is_fresh_in Xfr2' phi1' → evar_is_fresh_in Xu phi1' → eval (update_evar_val Xfr2' c ρ2') phi1'^{evar:0↦Xfr2'} = eval (update_evar_val Xu c ρ2') phi1'^{evar:0↦Xu}
ρe1': Valuation
Xfr1: evar
HeqXfr1: Xfr1 = fresh_evar phi1^[svar:dbi↦phi2]
Heqρe1': ρe1' = update_evar_val Xfr1 c ρ
ρe2': Valuation
Heqρe2': ρe2' = update_evar_val Xu c ρ
HeqHoc, HeqHoc': false = bsvar_occur phi1 dbi

eval ρe1' phi1^{evar:0↦Xfr1} = eval (update_evar_val Xu c ρ2') phi1'^{evar:0↦Xu}
(* Now svar_open does nothing to phi1, since it does not contain dbi (see HeqHoc). *)
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (ex , phi1) (S dbi)
H: X ∉ free_svars phi1
c: M
phi1': Pattern
Heqphi1': phi1' = phi1^[svar:dbi↦patt_free_svar X]
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1'
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi1' ∪ free_evars phi2))
ρ2': Valuation
Heqρ2': ρ2' = update_svar_val X (eval ρ phi2) ρ
Hfresh_subst: evar_is_fresh_in Xfr2' phi1' → evar_is_fresh_in Xu phi1' → eval (update_evar_val Xfr2' c ρ2') phi1'^{evar:0↦Xfr2'} = eval (update_evar_val Xu c ρ2') phi1'^{evar:0↦Xu}
ρe1': Valuation
Xfr1: evar
HeqXfr1: Xfr1 = fresh_evar phi1^[svar:dbi↦phi2]
Heqρe1': ρe1' = update_evar_val Xfr1 c ρ
ρe2': Valuation
Heqρe2': ρe2' = update_evar_val Xu c ρ
HeqHoc: bsvar_occur phi1 dbi = false
HeqHoc': false = bsvar_occur phi1 dbi

eval ρe1' phi1^{evar:0↦Xfr1} = eval (update_evar_val Xu c ρ2') phi1'^{evar:0↦Xu}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux phi1 (S dbi)
H: X ∉ free_svars phi1
c: M
phi1': Pattern
Heqphi1': phi1' = phi1^[svar:dbi↦patt_free_svar X]
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1'
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi1' ∪ free_evars phi2))
ρ2': Valuation
Heqρ2': ρ2' = update_svar_val X (eval ρ phi2) ρ
Hfresh_subst: evar_is_fresh_in Xfr2' phi1' → evar_is_fresh_in Xu phi1' → eval (update_evar_val Xfr2' c ρ2') phi1'^{evar:0↦Xfr2'} = eval (update_evar_val Xu c ρ2') phi1'^{evar:0↦Xu}
ρe1': Valuation
Xfr1: evar
HeqXfr1: Xfr1 = fresh_evar phi1^[svar:dbi↦phi2]
Heqρe1': ρe1' = update_evar_val Xfr1 c ρ
ρe2': Valuation
Heqρe2': ρe2' = update_evar_val Xu c ρ
HeqHoc: bsvar_occur phi1 dbi = false
HeqHoc': false = bsvar_occur phi1 dbi

eval ρe1' phi1^{evar:0↦Xfr1} = eval (update_evar_val Xu c ρ2') phi1'^{evar:0↦Xu}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux phi1 dbi = true
H: X ∉ free_svars phi1
c: M
phi1': Pattern
Heqphi1': phi1' = phi1^[svar:dbi↦patt_free_svar X]
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1'
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi1' ∪ free_evars phi2))
ρ2': Valuation
Heqρ2': ρ2' = update_svar_val X (eval ρ phi2) ρ
Hfresh_subst: evar_is_fresh_in Xfr2' phi1' → evar_is_fresh_in Xu phi1' → eval (update_evar_val Xfr2' c ρ2') phi1'^{evar:0↦Xfr2'} = eval (update_evar_val Xu c ρ2') phi1'^{evar:0↦Xu}
ρe1': Valuation
Xfr1: evar
HeqXfr1: Xfr1 = fresh_evar phi1^[svar:dbi↦phi2]
Heqρe1': ρe1' = update_evar_val Xfr1 c ρ
ρe2': Valuation
Heqρe2': ρe2' = update_evar_val Xu c ρ
HeqHoc: bsvar_occur phi1 dbi = false
HeqHoc': false = bsvar_occur phi1 dbi

eval ρe1' phi1^{evar:0↦Xfr1} = eval (update_evar_val Xu c ρ2') phi1'^{evar:0↦Xu}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux phi1 dbi = true
H: X ∉ free_svars phi1
c: M
phi1': Pattern
Heqphi1': phi1' = phi1^[svar:dbi↦patt_free_svar X]
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1'
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi1' ∪ free_evars phi2))
ρ2': Valuation
Heqρ2': ρ2' = update_svar_val X (eval ρ phi2) ρ
Hfresh_subst: evar_is_fresh_in Xfr2' phi1' → evar_is_fresh_in Xu phi1' → eval (update_evar_val Xfr2' c ρ2') phi1'^{evar:0↦Xfr2'} = eval (update_evar_val Xu c ρ2') phi1'^{evar:0↦Xu}
ρe1': Valuation
Xfr1: evar
HeqXfr1: Xfr1 = fresh_evar phi1^[svar:dbi↦phi2]
Heqρe1': ρe1' = update_evar_val Xfr1 c ρ
ρe2': Valuation
Heqρe2': ρe2' = update_evar_val Xu c ρ
HeqHoc: bsvar_occur phi1 dbi = false
HeqHoc': false = bsvar_occur phi1 dbi
HWF: phi1^{svar:dbi↦X} = phi1

eval ρe1' phi1^{evar:0↦Xfr1} = eval (update_evar_val Xu c ρ2') phi1'^{evar:0↦Xu}
(* X is not free in phi1, so the fact that in svar_val2' it is updated to some value is irrelevant. *)
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux phi1 dbi = true
H: X ∉ free_svars phi1
c: M
phi1': Pattern
Heqphi1': phi1' = phi1^[svar:dbi↦patt_free_svar X]
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1'
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi1' ∪ free_evars phi2))
Hfresh_subst: evar_is_fresh_in Xfr2' phi1' → evar_is_fresh_in Xu phi1' → eval (update_evar_val Xfr2' c (update_svar_val X (eval ρ phi2) ρ)) phi1'^{evar:0↦Xfr2'} = eval (update_evar_val Xu c (update_svar_val X (eval ρ phi2) ρ)) phi1'^{evar:0↦Xu}
Xfr1: evar
HeqXfr1: Xfr1 = fresh_evar phi1^[svar:dbi↦phi2]
HeqHoc: bsvar_occur phi1 dbi = false
HeqHoc': false = bsvar_occur phi1 dbi
HWF: phi1^{svar:dbi↦X} = phi1

eval (update_evar_val Xfr1 c ρ) phi1^{evar:0↦Xfr1} = eval (update_evar_val Xu c (update_svar_val X (eval ρ phi2) ρ)) phi1'^{evar:0↦Xu}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux phi1 dbi = true
H: X ∉ free_svars phi1
c: M
phi1': Pattern
Heqphi1': phi1' = phi1^[svar:dbi↦patt_free_svar X]
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1'
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi1' ∪ free_evars phi2))
Hfresh_subst: evar_is_fresh_in Xfr2' phi1' → evar_is_fresh_in Xu phi1' → eval (update_evar_val Xfr2' c (update_svar_val X (eval ρ phi2) ρ)) phi1'^{evar:0↦Xfr2'} = eval (update_evar_val Xu c (update_svar_val X (eval ρ phi2) ρ)) phi1'^{evar:0↦Xu}
Xfr1: evar
HeqXfr1: Xfr1 = fresh_evar phi1^[svar:dbi↦phi2]
HeqHoc: bsvar_occur phi1 dbi = false
HeqHoc': false = bsvar_occur phi1 dbi
HWF: phi1^{svar:dbi↦X} = phi1

eval (update_evar_val Xfr1 c ρ) phi1^{evar:0↦Xfr1} = eval (update_evar_val Xu c ρ) phi1'^{evar:0↦Xu}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux phi1 dbi = true
H: X ∉ free_svars phi1
c: M
phi1': Pattern
Heqphi1': phi1' = phi1^[svar:dbi↦patt_free_svar X]
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1'
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi1' ∪ free_evars phi2))
Hfresh_subst: evar_is_fresh_in Xfr2' phi1' → evar_is_fresh_in Xu phi1' → eval (update_evar_val Xfr2' c (update_svar_val X (eval ρ phi2) ρ)) phi1'^{evar:0↦Xfr2'} = eval (update_evar_val Xu c (update_svar_val X (eval ρ phi2) ρ)) phi1'^{evar:0↦Xu}
Xfr1: evar
HeqXfr1: Xfr1 = fresh_evar phi1^[svar:dbi↦phi2]
HeqHoc: bsvar_occur phi1 dbi = false
HeqHoc': false = bsvar_occur phi1 dbi
HWF: phi1^{svar:dbi↦X} = phi1
eval (update_evar_val Xu c ρ) phi1'^{evar:0↦Xu} = eval (update_evar_val Xu c (update_svar_val X (eval ρ phi2) ρ)) phi1'^{evar:0↦Xu}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux phi1 dbi = true
H: X ∉ free_svars phi1
c: M
phi1': Pattern
Heqphi1': phi1' = phi1^[svar:dbi↦patt_free_svar X]
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1'
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi1' ∪ free_evars phi2))
Hfresh_subst: evar_is_fresh_in Xfr2' phi1' → evar_is_fresh_in Xu phi1' → eval (update_evar_val Xfr2' c (update_svar_val X (eval ρ phi2) ρ)) phi1'^{evar:0↦Xfr2'} = eval (update_evar_val Xu c (update_svar_val X (eval ρ phi2) ρ)) phi1'^{evar:0↦Xu}
Xfr1: evar
HeqXfr1: Xfr1 = fresh_evar phi1^[svar:dbi↦phi2]
HeqHoc: bsvar_occur phi1 dbi = false
HeqHoc': false = bsvar_occur phi1 dbi
HWF: phi1^{svar:dbi↦X} = phi1

eval (update_evar_val Xu c ρ) phi1'^{evar:0↦Xu} = eval (update_evar_val Xu c (update_svar_val X (eval ρ phi2) ρ)) phi1'^{evar:0↦Xu}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux phi1 dbi = true
H: X ∉ free_svars phi1
c: M
phi1': Pattern
Heqphi1': phi1' = phi1^[svar:dbi↦patt_free_svar X]
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1'
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi1' ∪ free_evars phi2))
Hfresh_subst: evar_is_fresh_in Xfr2' phi1' → evar_is_fresh_in Xu phi1' → eval (update_evar_val Xfr2' c (update_svar_val X (eval ρ phi2) ρ)) phi1'^{evar:0↦Xfr2'} = eval (update_evar_val Xu c (update_svar_val X (eval ρ phi2) ρ)) phi1'^{evar:0↦Xu}
Xfr1: evar
HeqXfr1: Xfr1 = fresh_evar phi1^[svar:dbi↦phi2]
HeqHoc: bsvar_occur phi1 dbi = false
HeqHoc': false = bsvar_occur phi1 dbi
HWF: phi1^{svar:dbi↦X} = phi1

eval (update_evar_val Xu c ρ) phi1'^{evar:0↦Xu} = eval (update_svar_val X (eval ρ phi2) (update_evar_val Xu c ρ)) phi1'^{evar:0↦Xu}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux phi1 dbi = true
H: X ∉ free_svars phi1
c: M
phi1': Pattern
Heqphi1': phi1' = phi1^[svar:dbi↦patt_free_svar X]
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1'
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi1' ∪ free_evars phi2))
Hfresh_subst: evar_is_fresh_in Xfr2' phi1' → evar_is_fresh_in Xu phi1' → eval (update_evar_val Xfr2' c (update_svar_val X (eval ρ phi2) ρ)) phi1'^{evar:0↦Xfr2'} = eval (update_evar_val Xu c (update_svar_val X (eval ρ phi2) ρ)) phi1'^{evar:0↦Xu}
Xfr1: evar
HeqXfr1: Xfr1 = fresh_evar phi1^[svar:dbi↦phi2]
HeqHoc: bsvar_occur phi1 dbi = false
HeqHoc': false = bsvar_occur phi1 dbi
HWF: phi1^{svar:dbi↦X} = phi1

eval (update_svar_val X (eval ρ phi2) (update_evar_val Xu c ρ)) phi1'^{evar:0↦Xu} = eval (update_evar_val Xu c ρ) phi1'^{evar:0↦Xu}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux phi1 dbi = true
H: X ∉ free_svars phi1
c: M
phi1': Pattern
Heqphi1': phi1' = phi1^[svar:dbi↦patt_free_svar X]
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1'
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi1' ∪ free_evars phi2))
Hfresh_subst: evar_is_fresh_in Xfr2' phi1' → evar_is_fresh_in Xu phi1' → eval (update_evar_val Xfr2' c (update_svar_val X (eval ρ phi2) ρ)) phi1'^{evar:0↦Xfr2'} = eval (update_evar_val Xu c (update_svar_val X (eval ρ phi2) ρ)) phi1'^{evar:0↦Xu}
Xfr1: evar
HeqXfr1: Xfr1 = fresh_evar phi1^[svar:dbi↦phi2]
HeqHoc: bsvar_occur phi1 dbi = false
HeqHoc': false = bsvar_occur phi1 dbi
HWF: phi1^{svar:dbi↦X} = phi1

svar_is_fresh_in X phi1'^{evar:0↦Xu}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux phi1 dbi = true
H: X ∉ free_svars phi1
c: M
phi1': Pattern
Heqphi1': phi1' = phi1^[svar:dbi↦patt_free_svar X]
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1'
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi1' ∪ free_evars phi2))
Hfresh_subst: evar_is_fresh_in Xfr2' phi1' → evar_is_fresh_in Xu phi1' → eval (update_evar_val Xfr2' c (update_svar_val X (eval ρ phi2) ρ)) phi1'^{evar:0↦Xfr2'} = eval (update_evar_val Xu c (update_svar_val X (eval ρ phi2) ρ)) phi1'^{evar:0↦Xu}
Xfr1: evar
HeqXfr1: Xfr1 = fresh_evar phi1^[svar:dbi↦phi2]
HeqHoc: bsvar_occur phi1 dbi = false
HeqHoc': false = bsvar_occur phi1 dbi
HWF: phi1^{svar:dbi↦X} = phi1

X ∉ free_svars phi1'^{evar:0↦Xu}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux phi1 dbi = true
H: X ∉ free_svars phi1
c: M
phi1': Pattern
Heqphi1': phi1' = phi1^[svar:dbi↦patt_free_svar X]
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1'
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi1' ∪ free_evars phi2))
Hfresh_subst: evar_is_fresh_in Xfr2' phi1' → evar_is_fresh_in Xu phi1' → eval (update_evar_val Xfr2' c (update_svar_val X (eval ρ phi2) ρ)) phi1'^{evar:0↦Xfr2'} = eval (update_evar_val Xu c (update_svar_val X (eval ρ phi2) ρ)) phi1'^{evar:0↦Xu}
Xfr1: evar
HeqXfr1: Xfr1 = fresh_evar phi1^[svar:dbi↦phi2]
HeqHoc: bsvar_occur phi1 dbi = false
HeqHoc': false = bsvar_occur phi1 dbi
HWF: phi1^{svar:dbi↦X} = phi1

X ∉ free_svars phi1'
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux phi1 dbi = true
H: X ∉ free_svars phi1
c: M
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1^[svar:dbi↦patt_free_svar X]
Xu: evar
Hfresh_subst: evar_is_fresh_in Xfr2' phi1^[svar:dbi↦patt_free_svar X] → evar_is_fresh_in Xu phi1^[svar:dbi↦patt_free_svar X] → eval (update_evar_val Xfr2' c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦Xfr2'} = eval (update_evar_val Xu c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦Xu}
HeqXu: Xu = evar_fresh (elements (free_evars phi1^[svar:dbi↦ patt_free_svar X] ∪ free_evars phi2))
Xfr1: evar
HeqXfr1: Xfr1 = fresh_evar phi1^[svar:dbi↦phi2]
HeqHoc: bsvar_occur phi1 dbi = false
HeqHoc': false = bsvar_occur phi1 dbi
HWF: phi1^{svar:dbi↦X} = phi1

X ∉ free_svars phi1^[svar:dbi↦patt_free_svar X]
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux phi1 dbi = true
H: X ∉ free_svars phi1
c: M
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1^[svar:dbi↦patt_free_svar X]
Xu: evar
Hfresh_subst: evar_is_fresh_in Xfr2' phi1^[svar:dbi↦patt_free_svar X] → evar_is_fresh_in Xu phi1^[svar:dbi↦patt_free_svar X] → eval (update_evar_val Xfr2' c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦Xfr2'} = eval (update_evar_val Xu c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦Xu}
HeqXu: Xu = evar_fresh (elements (free_evars phi1^[svar:dbi↦ patt_free_svar X] ∪ free_evars phi2))
Xfr1: evar
HeqXfr1: Xfr1 = fresh_evar phi1^[svar:dbi↦phi2]
HeqHoc: bsvar_occur phi1 dbi = false
HeqHoc': false = bsvar_occur phi1 dbi
HWF: phi1^{svar:dbi↦X} = phi1

X ∉ free_svars phi1^{svar:dbi↦X}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux phi1 dbi = true
H: X ∉ free_svars phi1
c: M
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1^[svar:dbi↦patt_free_svar X]
Xu: evar
Hfresh_subst: evar_is_fresh_in Xfr2' phi1^[svar:dbi↦patt_free_svar X] → evar_is_fresh_in Xu phi1^[svar:dbi↦patt_free_svar X] → eval (update_evar_val Xfr2' c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦Xfr2'} = eval (update_evar_val Xu c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦Xu}
HeqXu: Xu = evar_fresh (elements (free_evars phi1^[svar:dbi↦ patt_free_svar X] ∪ free_evars phi2))
Xfr1: evar
HeqXfr1: Xfr1 = fresh_evar phi1^[svar:dbi↦phi2]
HeqHoc: bsvar_occur phi1 dbi = false
HeqHoc': false = bsvar_occur phi1 dbi
HWF: phi1^{svar:dbi↦X} = phi1

X ∉ free_svars phi1
auto.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux phi1 dbi = true
H: X ∉ free_svars phi1
c: M
phi1': Pattern
Heqphi1': phi1' = phi1^[svar:dbi↦patt_free_svar X]
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1'
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi1' ∪ free_evars phi2))
Hfresh_subst: evar_is_fresh_in Xfr2' phi1' → evar_is_fresh_in Xu phi1' → eval (update_evar_val Xfr2' c (update_svar_val X (eval ρ phi2) ρ)) phi1'^{evar:0↦Xfr2'} = eval (update_evar_val Xu c (update_svar_val X (eval ρ phi2) ρ)) phi1'^{evar:0↦Xu}
Xfr1: evar
HeqXfr1: Xfr1 = fresh_evar phi1^[svar:dbi↦phi2]
HeqHoc: bsvar_occur phi1 dbi = false
HeqHoc': false = bsvar_occur phi1 dbi
HWF: phi1^{svar:dbi↦X} = phi1

eval (update_evar_val Xfr1 c ρ) phi1^{evar:0↦Xfr1} = eval (update_evar_val Xu c ρ) phi1'^{evar:0↦Xu}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux phi1 dbi = true
H: X ∉ free_svars phi1
c: M
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1^[svar:dbi↦patt_free_svar X]
Xu: evar
Hfresh_subst: evar_is_fresh_in Xfr2' phi1^[svar:dbi↦patt_free_svar X] → evar_is_fresh_in Xu phi1^[svar:dbi↦patt_free_svar X] → eval (update_evar_val Xfr2' c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦Xfr2'} = eval (update_evar_val Xu c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦Xu}
HeqXu: Xu = evar_fresh (elements (free_evars phi1^[svar:dbi↦ patt_free_svar X] ∪ free_evars phi2))
Xfr1: evar
HeqXfr1: Xfr1 = fresh_evar phi1^[svar:dbi↦phi2]
HeqHoc: bsvar_occur phi1 dbi = false
HeqHoc': false = bsvar_occur phi1 dbi
HWF: phi1^{svar:dbi↦X} = phi1

eval (update_evar_val Xfr1 c ρ) phi1^{evar:0↦Xfr1} = eval (update_evar_val Xu c ρ) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦Xu}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux phi1 dbi = true
H: X ∉ free_svars phi1
c: M
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1^[svar:dbi↦patt_free_svar X]
Xu: evar
Hfresh_subst: evar_is_fresh_in Xfr2' phi1^[svar:dbi↦patt_free_svar X] → evar_is_fresh_in Xu phi1^[svar:dbi↦patt_free_svar X] → eval (update_evar_val Xfr2' c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦Xfr2'} = eval (update_evar_val Xu c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦Xu}
HeqXu: Xu = evar_fresh (elements (free_evars phi1^[svar:dbi↦ patt_free_svar X] ∪ free_evars phi2))
Xfr1: evar
HeqXfr1: Xfr1 = fresh_evar phi1^[svar:dbi↦phi2]
HeqHoc: bsvar_occur phi1 dbi = false
HeqHoc': false = bsvar_occur phi1 dbi
HWF: phi1^[svar:dbi↦patt_free_svar X] = phi1

eval (update_evar_val Xfr1 c ρ) phi1^{evar:0↦Xfr1} = eval (update_evar_val Xu c ρ) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦Xu}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux phi1 dbi = true
H: X ∉ free_svars phi1
c: M
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1^[svar:dbi↦patt_free_svar X]
Xu: evar
Hfresh_subst: evar_is_fresh_in Xfr2' phi1^[svar:dbi↦patt_free_svar X] → evar_is_fresh_in Xu phi1^[svar:dbi↦patt_free_svar X] → eval (update_evar_val Xfr2' c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦Xfr2'} = eval (update_evar_val Xu c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦Xu}
HeqXu: Xu = evar_fresh (elements (free_evars phi1^[svar:dbi↦ patt_free_svar X] ∪ free_evars phi2))
Xfr1: evar
HeqXfr1: Xfr1 = fresh_evar phi1^[svar:dbi↦phi2]
HeqHoc: bsvar_occur phi1 dbi = false
HeqHoc': false = bsvar_occur phi1 dbi
HWF: phi1^[svar:dbi↦patt_free_svar X] = phi1

eval (update_evar_val Xfr1 c ρ) phi1^{evar:0↦Xfr1} = eval (update_evar_val Xu c ρ) phi1^{evar:0↦Xu}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux phi1 dbi = true
H: X ∉ free_svars phi1
c: M
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1^[svar:dbi↦patt_free_svar X]
Xu: evar
Hfresh_subst: evar_is_fresh_in Xfr2' phi1^[svar:dbi↦patt_free_svar X] → evar_is_fresh_in Xu phi1^[svar:dbi↦patt_free_svar X] → eval (update_evar_val Xfr2' c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦Xfr2'} = eval (update_evar_val Xu c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦Xu}
HeqXu: Xu = evar_fresh (elements (free_evars phi1^[svar:dbi↦ patt_free_svar X] ∪ free_evars phi2))
Xfr1: evar
HeqXfr1: Xfr1 = fresh_evar phi1^[svar:dbi↦phi2]
HeqHoc: bsvar_occur phi1 dbi = false
HeqHoc': false = bsvar_occur phi1 dbi
HWF: phi1^[svar:dbi↦patt_free_svar X] = phi1

eval (update_evar_val Xu c ρ) phi1^{evar:0↦Xu} = eval (update_evar_val Xu c ρ) phi1^{evar:0↦Xu}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux phi1 dbi = true
H: X ∉ free_svars phi1
c: M
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1^[svar:dbi↦patt_free_svar X]
Xu: evar
Hfresh_subst: evar_is_fresh_in Xfr2' phi1^[svar:dbi↦patt_free_svar X] → evar_is_fresh_in Xu phi1^[svar:dbi↦patt_free_svar X] → eval (update_evar_val Xfr2' c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦Xfr2'} = eval (update_evar_val Xu c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦Xu}
HeqXu: Xu = evar_fresh (elements (free_evars phi1^[svar:dbi↦ patt_free_svar X] ∪ free_evars phi2))
Xfr1: evar
HeqXfr1: Xfr1 = fresh_evar phi1^[svar:dbi↦phi2]
HeqHoc: bsvar_occur phi1 dbi = false
HeqHoc': false = bsvar_occur phi1 dbi
HWF: phi1^[svar:dbi↦patt_free_svar X] = phi1
evar_is_fresh_in Xfr1 phi1
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux phi1 dbi = true
H: X ∉ free_svars phi1
c: M
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1^[svar:dbi↦patt_free_svar X]
Xu: evar
Hfresh_subst: evar_is_fresh_in Xfr2' phi1^[svar:dbi↦patt_free_svar X] → evar_is_fresh_in Xu phi1^[svar:dbi↦patt_free_svar X] → eval (update_evar_val Xfr2' c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦Xfr2'} = eval (update_evar_val Xu c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦Xu}
HeqXu: Xu = evar_fresh (elements (free_evars phi1^[svar:dbi↦ patt_free_svar X] ∪ free_evars phi2))
Xfr1: evar
HeqXfr1: Xfr1 = fresh_evar phi1^[svar:dbi↦phi2]
HeqHoc: bsvar_occur phi1 dbi = false
HeqHoc': false = bsvar_occur phi1 dbi
HWF: phi1^[svar:dbi↦patt_free_svar X] = phi1
evar_is_fresh_in Xu phi1
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux phi1 dbi = true
H: X ∉ free_svars phi1
c: M
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1^[svar:dbi↦patt_free_svar X]
Xu: evar
Hfresh_subst: evar_is_fresh_in Xfr2' phi1^[svar:dbi↦patt_free_svar X] → evar_is_fresh_in Xu phi1^[svar:dbi↦patt_free_svar X] → eval (update_evar_val Xfr2' c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦Xfr2'} = eval (update_evar_val Xu c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦Xu}
HeqXu: Xu = evar_fresh (elements (free_evars phi1^[svar:dbi↦ patt_free_svar X] ∪ free_evars phi2))
Xfr1: evar
HeqXfr1: Xfr1 = fresh_evar phi1^[svar:dbi↦phi2]
HeqHoc: bsvar_occur phi1 dbi = false
HeqHoc': false = bsvar_occur phi1 dbi
HWF: phi1^[svar:dbi↦patt_free_svar X] = phi1

eval (update_evar_val Xu c ρ) phi1^{evar:0↦Xu} = eval (update_evar_val Xu c ρ) phi1^{evar:0↦Xu}
reflexivity.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux phi1 dbi = true
H: X ∉ free_svars phi1
c: M
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1^[svar:dbi↦patt_free_svar X]
Xu: evar
Hfresh_subst: evar_is_fresh_in Xfr2' phi1^[svar:dbi↦patt_free_svar X] → evar_is_fresh_in Xu phi1^[svar:dbi↦patt_free_svar X] → eval (update_evar_val Xfr2' c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦Xfr2'} = eval (update_evar_val Xu c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦Xu}
HeqXu: Xu = evar_fresh (elements (free_evars phi1^[svar:dbi↦ patt_free_svar X] ∪ free_evars phi2))
Xfr1: evar
HeqXfr1: Xfr1 = fresh_evar phi1^[svar:dbi↦phi2]
HeqHoc: bsvar_occur phi1 dbi = false
HeqHoc': false = bsvar_occur phi1 dbi
HWF: phi1^[svar:dbi↦patt_free_svar X] = phi1

evar_is_fresh_in Xfr1 phi1
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux phi1 dbi = true
H: X ∉ free_svars phi1
c: M
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1^[svar:dbi↦patt_free_svar X]
Xu: evar
Hfresh_subst: evar_is_fresh_in Xfr2' phi1^[svar:dbi↦patt_free_svar X] → evar_is_fresh_in Xu phi1^[svar:dbi↦patt_free_svar X] → eval (update_evar_val Xfr2' c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦Xfr2'} = eval (update_evar_val Xu c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦Xu}
HeqXu: Xu = evar_fresh (elements (free_evars phi1^[svar:dbi↦ patt_free_svar X] ∪ free_evars phi2))
Xfr1: evar
HeqXfr1: Xfr1 = fresh_evar phi1^[svar:dbi↦phi2]
HeqHoc: bsvar_occur phi1 dbi = false
HeqHoc': false = bsvar_occur phi1 dbi
HWF: phi1^[svar:dbi↦patt_free_svar X] = phi1
evar_is_fresh_in Xu phi1
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux phi1 dbi = true
H: X ∉ free_svars phi1
c: M
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1^[svar:dbi↦patt_free_svar X]
Xu: evar
Hfresh_subst: evar_is_fresh_in Xfr2' phi1^[svar:dbi↦patt_free_svar X] → evar_is_fresh_in Xu phi1^[svar:dbi↦patt_free_svar X] → eval (update_evar_val Xfr2' c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦Xfr2'} = eval (update_evar_val Xu c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦Xu}
HeqXu: Xu = evar_fresh (elements (free_evars phi1^[svar:dbi↦ patt_free_svar X] ∪ free_evars phi2))
Xfr1: evar
HeqXfr1: Xfr1 = fresh_evar phi1^[svar:dbi↦phi2]
HeqHoc: bsvar_occur phi1 dbi = false
HeqHoc': false = bsvar_occur phi1 dbi
HWF: phi1^[svar:dbi↦patt_free_svar X] = phi1

evar_is_fresh_in Xfr1 phi1
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux phi1 dbi = true
H: X ∉ free_svars phi1
c: M
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1^[svar:dbi↦patt_free_svar X]
Xu: evar
Hfresh_subst: evar_is_fresh_in Xfr2' phi1^[svar:dbi↦patt_free_svar X] → evar_is_fresh_in Xu phi1^[svar:dbi↦patt_free_svar X] → eval (update_evar_val Xfr2' c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦Xfr2'} = eval (update_evar_val Xu c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦Xu}
HeqXu: Xu = evar_fresh (elements (free_evars phi1^[svar:dbi↦ patt_free_svar X] ∪ free_evars phi2))
HeqHoc: bsvar_occur phi1 dbi = false
HeqHoc': false = bsvar_occur phi1 dbi
HWF: phi1^[svar:dbi↦patt_free_svar X] = phi1

evar_is_fresh_in (fresh_evar phi1^[svar:dbi↦phi2]) phi1
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux phi1 dbi = true
H: X ∉ free_svars phi1
c: M
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1^[svar:dbi↦patt_free_svar X]
Xu: evar
Hfresh_subst: evar_is_fresh_in Xfr2' phi1^[svar:dbi↦patt_free_svar X] → evar_is_fresh_in Xu phi1^[svar:dbi↦patt_free_svar X] → eval (update_evar_val Xfr2' c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦Xfr2'} = eval (update_evar_val Xu c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦Xu}
HeqXu: Xu = evar_fresh (elements (free_evars phi1^[svar:dbi↦ patt_free_svar X] ∪ free_evars phi2))
HeqHoc, HeqHoc': bsvar_occur phi1 dbi = false
HWF: phi1^[svar:dbi↦patt_free_svar X] = phi1

evar_is_fresh_in (fresh_evar phi1^[svar:dbi↦phi2]) phi1
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux phi1 dbi = true
H: X ∉ free_svars phi1
c: M
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1^[svar:dbi↦patt_free_svar X]
Xu: evar
Hfresh_subst: evar_is_fresh_in Xfr2' phi1^[svar:dbi↦patt_free_svar X] → evar_is_fresh_in Xu phi1^[svar:dbi↦patt_free_svar X] → eval (update_evar_val Xfr2' c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦Xfr2'} = eval (update_evar_val Xu c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦Xu}
HeqXu: Xu = evar_fresh (elements (free_evars phi1^[svar:dbi↦ patt_free_svar X] ∪ free_evars phi2))
HeqHoc, HeqHoc': bsvar_occur phi1 dbi = false
HWF: phi1^[svar:dbi↦patt_free_svar X] = phi1
Hsubst: phi1^[svar:dbi↦phi2] = phi1

evar_is_fresh_in (fresh_evar phi1^[svar:dbi↦phi2]) phi1
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux phi1 dbi = true
H: X ∉ free_svars phi1
c: M
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1^[svar:dbi↦patt_free_svar X]
Xu: evar
Hfresh_subst: evar_is_fresh_in Xfr2' phi1^[svar:dbi↦patt_free_svar X] → evar_is_fresh_in Xu phi1^[svar:dbi↦patt_free_svar X] → eval (update_evar_val Xfr2' c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦Xfr2'} = eval (update_evar_val Xu c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦Xu}
HeqXu: Xu = evar_fresh (elements (free_evars phi1^[svar:dbi↦ patt_free_svar X] ∪ free_evars phi2))
HeqHoc, HeqHoc': bsvar_occur phi1 dbi = false
HWF: phi1^[svar:dbi↦patt_free_svar X] = phi1
Hsubst: phi1^[svar:dbi↦phi2] = phi1

evar_is_fresh_in (fresh_evar phi1) phi1
auto.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux phi1 dbi = true
H: X ∉ free_svars phi1
c: M
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1^[svar:dbi↦patt_free_svar X]
Xu: evar
Hfresh_subst: evar_is_fresh_in Xfr2' phi1^[svar:dbi↦patt_free_svar X] → evar_is_fresh_in Xu phi1^[svar:dbi↦patt_free_svar X] → eval (update_evar_val Xfr2' c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦Xfr2'} = eval (update_evar_val Xu c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦Xu}
HeqXu: Xu = evar_fresh (elements (free_evars phi1^[svar:dbi↦ patt_free_svar X] ∪ free_evars phi2))
Xfr1: evar
HeqXfr1: Xfr1 = fresh_evar phi1^[svar:dbi↦phi2]
HeqHoc: bsvar_occur phi1 dbi = false
HeqHoc': false = bsvar_occur phi1 dbi
HWF: phi1^[svar:dbi↦patt_free_svar X] = phi1

evar_is_fresh_in Xu phi1
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux phi1 dbi = true
H: X ∉ free_svars phi1
c: M
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1^[svar:dbi↦patt_free_svar X]
Xu: evar
Hfresh_subst: evar_is_fresh_in Xfr2' phi1^[svar:dbi↦patt_free_svar X] → evar_is_fresh_in Xu phi1^[svar:dbi↦patt_free_svar X] → eval (update_evar_val Xfr2' c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦Xfr2'} = eval (update_evar_val Xu c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦Xu}
HeqXu: Xu = evar_fresh (elements (free_evars phi1^[svar:dbi↦ patt_free_svar X] ∪ free_evars phi2))
Xfr1: evar
HeqXfr1: Xfr1 = fresh_evar phi1^[svar:dbi↦phi2]
HeqHoc: bsvar_occur phi1 dbi = false
HeqHoc': false = bsvar_occur phi1 dbi
HWF: phi1^[svar:dbi↦patt_free_svar X] = phi1

evar_is_fresh_in Xu phi1
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux phi1 dbi = true
H: X ∉ free_svars phi1
c: M
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1^[svar:dbi↦patt_free_svar X]
Xu: evar
Hfresh_subst: evar_is_fresh_in Xfr2' phi1^[svar:dbi↦patt_free_svar X] → evar_is_fresh_in Xu phi1^[svar:dbi↦patt_free_svar X] → eval (update_evar_val Xfr2' c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦Xfr2'} = eval (update_evar_val Xu c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦Xu}
HeqXu: Xu = evar_fresh (elements (free_evars phi1^[svar:dbi↦ patt_free_svar X] ∪ free_evars phi2))
Xfr1: evar
HeqXfr1: Xfr1 = fresh_evar phi1^[svar:dbi↦phi2]
HeqHoc: bsvar_occur phi1 dbi = false
HeqHoc': false = bsvar_occur phi1 dbi
HWF: phi1^[svar:dbi↦patt_free_svar X] = phi1
Hfr: S : EVarSet, evar_fresh (elements S) ∉ S

evar_is_fresh_in Xu phi1
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux phi1 dbi = true
H: X ∉ free_svars phi1
c: M
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1^[svar:dbi↦patt_free_svar X]
Xu: evar
Hfresh_subst: evar_is_fresh_in Xfr2' phi1^[svar:dbi↦patt_free_svar X] → evar_is_fresh_in Xu phi1^[svar:dbi↦patt_free_svar X] → eval (update_evar_val Xfr2' c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦Xfr2'} = eval (update_evar_val Xu c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦Xu}
HeqXu: Xu = evar_fresh (elements (free_evars phi1^[svar:dbi↦ patt_free_svar X] ∪ free_evars phi2))
Xfr1: evar
HeqXfr1: Xfr1 = fresh_evar phi1^[svar:dbi↦phi2]
HeqHoc: bsvar_occur phi1 dbi = false
HeqHoc': false = bsvar_occur phi1 dbi
HWF: phi1^[svar:dbi↦patt_free_svar X] = phi1
Hfr: evar_fresh (elements (free_evars phi1^{svar:dbi↦X} ∪ free_evars phi2)) ∉ free_evars phi1^{svar:dbi↦X} ∪ free_evars phi2

evar_is_fresh_in Xu phi1
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux phi1 dbi = true
H: X ∉ free_svars phi1
c: M
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1^[svar:dbi↦patt_free_svar X]
Hfresh_subst: evar_is_fresh_in Xfr2' phi1^[svar:dbi↦patt_free_svar X] → evar_is_fresh_in (evar_fresh (elements (free_evars phi1^[svar:dbi↦ patt_free_svar X] ∪ free_evars phi2))) phi1^[svar:dbi↦patt_free_svar X] → eval (update_evar_val Xfr2' c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦Xfr2'} = eval (update_evar_val (evar_fresh (elements (free_evars phi1^[svar:dbi↦ patt_free_svar X] ∪ free_evars phi2))) c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦ evar_fresh (elements (free_evars phi1^[svar:dbi↦ patt_free_svar X] ∪ free_evars phi2))}
Xfr1: evar
HeqXfr1: Xfr1 = fresh_evar phi1^[svar:dbi↦phi2]
HeqHoc: bsvar_occur phi1 dbi = false
HeqHoc': false = bsvar_occur phi1 dbi
HWF: phi1^[svar:dbi↦patt_free_svar X] = phi1
Hfr: evar_fresh (elements (free_evars phi1^{svar:dbi↦X} ∪ free_evars phi2)) ∉ free_evars phi1^{svar:dbi↦X} ∪ free_evars phi2

evar_is_fresh_in (evar_fresh (elements (free_evars phi1^[svar:dbi↦patt_free_svar X] ∪ free_evars phi2))) phi1
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux phi1 dbi = true
H: X ∉ free_svars phi1
c: M
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1^[svar:dbi↦patt_free_svar X]
Hfresh_subst: evar_is_fresh_in Xfr2' phi1^[svar:dbi↦patt_free_svar X] → evar_is_fresh_in (evar_fresh (elements (free_evars phi1^[svar:dbi↦ patt_free_svar X] ∪ free_evars phi2))) phi1^[svar:dbi↦patt_free_svar X] → eval (update_evar_val Xfr2' c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦Xfr2'} = eval (update_evar_val (evar_fresh (elements (free_evars phi1^[svar:dbi↦ patt_free_svar X] ∪ free_evars phi2))) c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦ evar_fresh (elements (free_evars phi1^[svar:dbi↦ patt_free_svar X] ∪ free_evars phi2))}
Xfr1: evar
HeqXfr1: Xfr1 = fresh_evar phi1^[svar:dbi↦phi2]
HeqHoc: bsvar_occur phi1 dbi = false
HeqHoc': false = bsvar_occur phi1 dbi
HWF: phi1^[svar:dbi↦patt_free_svar X] = phi1
Hfr: (evar_fresh (elements (free_evars phi1^{svar:dbi↦X} ∪ free_evars phi2)) ∉ free_evars phi1^{svar:dbi↦X}) ∧ evar_fresh (elements (free_evars phi1^{svar:dbi↦X} ∪ free_evars phi2)) ∉ free_evars phi2

evar_is_fresh_in (evar_fresh (elements (free_evars phi1^[svar:dbi↦patt_free_svar X] ∪ free_evars phi2))) phi1
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux phi1 dbi = true
H: X ∉ free_svars phi1
c: M
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1^[svar:dbi↦patt_free_svar X]
Hfresh_subst: evar_is_fresh_in Xfr2' phi1^[svar:dbi↦patt_free_svar X] → evar_is_fresh_in (evar_fresh (elements (free_evars phi1^[svar:dbi↦ patt_free_svar X] ∪ free_evars phi2))) phi1^[svar:dbi↦patt_free_svar X] → eval (update_evar_val Xfr2' c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦Xfr2'} = eval (update_evar_val (evar_fresh (elements (free_evars phi1^[svar:dbi↦ patt_free_svar X] ∪ free_evars phi2))) c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦ evar_fresh (elements (free_evars phi1^[svar:dbi↦ patt_free_svar X] ∪ free_evars phi2))}
Xfr1: evar
HeqXfr1: Xfr1 = fresh_evar phi1^[svar:dbi↦phi2]
HeqHoc: bsvar_occur phi1 dbi = false
HeqHoc': false = bsvar_occur phi1 dbi
HWF: phi1^[svar:dbi↦patt_free_svar X] = phi1
Hfr: evar_fresh (elements (free_evars phi1^{svar:dbi↦X} ∪ free_evars phi2)) ∉ free_evars phi1^{svar:dbi↦X}

evar_is_fresh_in (evar_fresh (elements (free_evars phi1^[svar:dbi↦patt_free_svar X] ∪ free_evars phi2))) phi1
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux phi1 dbi = true
H: X ∉ free_svars phi1
c: M
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1^[svar:dbi↦patt_free_svar X]
Hfresh_subst: evar_is_fresh_in Xfr2' phi1^[svar:dbi↦patt_free_svar X] → evar_is_fresh_in (evar_fresh (elements (free_evars phi1^[svar:dbi↦ patt_free_svar X] ∪ free_evars phi2))) phi1^[svar:dbi↦patt_free_svar X] → eval (update_evar_val Xfr2' c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦Xfr2'} = eval (update_evar_val (evar_fresh (elements (free_evars phi1^[svar:dbi↦ patt_free_svar X] ∪ free_evars phi2))) c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦ evar_fresh (elements (free_evars phi1^[svar:dbi↦ patt_free_svar X] ∪ free_evars phi2))}
Xfr1: evar
HeqXfr1: Xfr1 = fresh_evar phi1^[svar:dbi↦phi2]
HeqHoc: bsvar_occur phi1 dbi = false
HeqHoc': false = bsvar_occur phi1 dbi
HWF: phi1^[svar:dbi↦patt_free_svar X] = phi1
Hfr: evar_fresh (elements (free_evars phi1 ∪ free_evars phi2)) ∉ free_evars phi1

evar_is_fresh_in (evar_fresh (elements (free_evars phi1^[svar:dbi↦patt_free_svar X] ∪ free_evars phi2))) phi1
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^[svar:dbi↦ patt_free_svar X]
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux phi1 dbi = true
H: X ∉ free_svars phi1
c: M
Xfr2': evar
HeqXfr2': Xfr2' = fresh_evar phi1^[svar:dbi↦patt_free_svar X]
Hfresh_subst: evar_is_fresh_in Xfr2' phi1^[svar:dbi↦patt_free_svar X] → evar_is_fresh_in (evar_fresh (elements (free_evars phi1^[svar:dbi↦ patt_free_svar X] ∪ free_evars phi2))) phi1^[svar:dbi↦patt_free_svar X] → eval (update_evar_val Xfr2' c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦Xfr2'} = eval (update_evar_val (evar_fresh (elements (free_evars phi1^[svar:dbi↦ patt_free_svar X] ∪ free_evars phi2))) c (update_svar_val X (eval ρ phi2) ρ)) phi1^[svar:dbi↦patt_free_svar X]^{evar:0↦ evar_fresh (elements (free_evars phi1^[svar:dbi↦ patt_free_svar X] ∪ free_evars phi2))}
Xfr1: evar
HeqXfr1: Xfr1 = fresh_evar phi1^[svar:dbi↦phi2]
HeqHoc: bsvar_occur phi1 dbi = false
HeqHoc': false = bsvar_occur phi1 dbi
HWF: phi1^[svar:dbi↦patt_free_svar X] = phi1
Hfr: evar_fresh (elements (free_evars phi1 ∪ free_evars phi2)) ∉ free_evars phi1

evar_is_fresh_in (evar_fresh (elements (free_evars phi1 ∪ free_evars phi2))) phi1
auto. }
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)

eval ρ (mu , phi1^[svar:S dbi↦phi2]) = eval (update_svar_val X (eval ρ phi2) ρ) (mu , phi1)^{svar:dbi↦X}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)

eval ρ (mu , phi1^[svar:S dbi↦phi2]) = eval (update_svar_val X (eval ρ phi2) ρ) (mu , phi1^{svar:increase_mu pm_spec_data dbi↦X})
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)

eval ρ (mu , phi1^[svar:S dbi↦phi2]) = eval (update_svar_val X (eval ρ phi2) ρ) (mu , phi1^{svar:S dbi↦X})
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)

(let X := fresh_svar phi1^[svar:S dbi↦phi2] in LeastFixpointOf (λ S0 : propset M, let ρ' := update_svar_val X S0 ρ in eval ρ' phi1^[svar:S dbi↦phi2]^{svar:0↦X})) = (let X0 := fresh_svar phi1^{svar:S dbi↦X} in LeastFixpointOf (λ S0 : propset M, let ρ' := update_svar_val X0 S0 (update_svar_val X (eval ρ phi2) ρ) in eval ρ' phi1^{svar:S dbi↦X}^{svar:0↦X0}))
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)

LeastFixpointOf (λ S0 : propset M, eval (update_svar_val (fresh_svar phi1^[svar:S dbi↦phi2]) S0 ρ) phi1^[svar:S dbi↦phi2]^{svar:0↦fresh_svar phi1^[svar: S dbi↦phi2]}) = LeastFixpointOf (λ S0 : propset M, eval (update_svar_val (fresh_svar phi1^{svar:S dbi↦X}) S0 (update_svar_val X (eval ρ phi2) ρ)) phi1^{svar:S dbi↦X}^{svar:0↦fresh_svar phi1^{svar:S dbi↦X}})
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)

(λ S0 : propset M, eval (update_svar_val (fresh_svar phi1^[svar:S dbi↦phi2]) S0 ρ) phi1^[svar:S dbi↦phi2]^{svar:0↦fresh_svar phi1^[svar:S dbi↦phi2]}) = (λ S0 : propset M, eval (update_svar_val (fresh_svar phi1^{svar:S dbi↦X}) S0 (update_svar_val X (eval ρ phi2) ρ)) phi1^{svar:S dbi↦X}^{svar:0↦fresh_svar phi1^{svar:S dbi↦X}})
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)

x : propset M, eval (update_svar_val (fresh_svar phi1^[svar:S dbi↦phi2]) x ρ) phi1^[svar:S dbi↦phi2]^{svar:0↦fresh_svar phi1^[svar:S dbi↦phi2]} = eval (update_svar_val (fresh_svar phi1^{svar:S dbi↦X}) x (update_svar_val X (eval ρ phi2) ρ)) phi1^{svar:S dbi↦X}^{svar:0↦fresh_svar phi1^{svar:S dbi↦X}}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M

eval (update_svar_val (fresh_svar phi1^[svar:S dbi↦phi2]) E ρ) phi1^[svar:S dbi↦phi2]^{svar:0↦fresh_svar phi1^[svar:S dbi↦phi2]} = eval (update_svar_val (fresh_svar phi1^{svar:S dbi↦X}) E (update_svar_val X (eval ρ phi2) ρ)) phi1^{svar:S dbi↦X}^{svar:0↦fresh_svar phi1^{svar:S dbi↦X}}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
phi_subst: Pattern
Heqphi_subst: phi_subst = phi1^[svar:S dbi↦phi2]

eval (update_svar_val (fresh_svar phi_subst) E ρ) phi_subst^{svar:0↦fresh_svar phi_subst} = eval (update_svar_val (fresh_svar phi1^{svar:S dbi↦X}) E (update_svar_val X (eval ρ phi2) ρ)) phi1^{svar:S dbi↦X}^{svar:0↦fresh_svar phi1^{svar:S dbi↦X}}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
phi_subst: Pattern
Heqphi_subst: phi_subst = phi1^[svar:S dbi↦phi2]
B: SVarSet
HeqB: B = free_svars phi_subst ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2

eval (update_svar_val (fresh_svar phi_subst) E ρ) phi_subst^{svar:0↦fresh_svar phi_subst} = eval (update_svar_val (fresh_svar phi1^{svar:S dbi↦X}) E (update_svar_val X (eval ρ phi2) ρ)) phi1^{svar:S dbi↦X}^{svar:0↦fresh_svar phi1^{svar:S dbi↦X}}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
phi_subst: Pattern
Heqphi_subst: phi_subst = phi1^[svar:S dbi↦phi2]
B: SVarSet
HeqB: B = free_svars phi_subst ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)

eval (update_svar_val (fresh_svar phi_subst) E ρ) phi_subst^{svar:0↦fresh_svar phi_subst} = eval (update_svar_val (fresh_svar phi1^{svar:S dbi↦X}) E (update_svar_val X (eval ρ phi2) ρ)) phi1^{svar:S dbi↦X}^{svar:0↦fresh_svar phi1^{svar:S dbi↦X}}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
phi_subst: Pattern
Heqphi_subst: phi_subst = phi1^[svar:S dbi↦phi2]
B: SVarSet
HeqB: B = free_svars phi_subst ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)

Y ≠ fresh_svar phi1
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
phi_subst: Pattern
Heqphi_subst: phi_subst = phi1^[svar:S dbi↦phi2]
B: SVarSet
HeqB: B = free_svars phi_subst ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
eval (update_svar_val (fresh_svar phi_subst) E ρ) phi_subst^{svar:0↦fresh_svar phi_subst} = eval (update_svar_val (fresh_svar phi1^{svar:S dbi↦X}) E (update_svar_val X (eval ρ phi2) ρ)) phi1^{svar:S dbi↦X}^{svar:0↦ fresh_svar phi1^{svar: S dbi↦X}}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
phi_subst: Pattern
Heqphi_subst: phi_subst = phi1^[svar:S dbi↦phi2]
B: SVarSet
HeqB: B = free_svars phi_subst ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)

Y ≠ fresh_svar phi1
solve_fresh_svar_neq.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
phi_subst: Pattern
Heqphi_subst: phi_subst = phi1^[svar:S dbi↦phi2]
B: SVarSet
HeqB: B = free_svars phi_subst ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1

eval (update_svar_val (fresh_svar phi_subst) E ρ) phi_subst^{svar:0↦fresh_svar phi_subst} = eval (update_svar_val (fresh_svar phi1^{svar:S dbi↦X}) E (update_svar_val X (eval ρ phi2) ρ)) phi1^{svar:S dbi↦X}^{svar:0↦fresh_svar phi1^{svar:S dbi↦X}}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
phi_subst: Pattern
Heqphi_subst: phi_subst = phi1^[svar:S dbi↦phi2]
B: SVarSet
HeqB: B = free_svars phi_subst ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1

svar_is_fresh_in Y phi1
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
phi_subst: Pattern
Heqphi_subst: phi_subst = phi1^[svar:S dbi↦phi2]
B: SVarSet
HeqB: B = free_svars phi_subst ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
eval (update_svar_val (fresh_svar phi_subst) E ρ) phi_subst^{svar:0↦fresh_svar phi_subst} = eval (update_svar_val (fresh_svar phi1^{svar:S dbi↦X}) E (update_svar_val X (eval ρ phi2) ρ)) phi1^{svar:S dbi↦X}^{svar:0↦ fresh_svar phi1^{svar: S dbi↦X}}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
phi_subst: Pattern
Heqphi_subst: phi_subst = phi1^[svar:S dbi↦phi2]
B: SVarSet
HeqB: B = free_svars phi_subst ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1

svar_is_fresh_in Y phi1
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
Hfreshy: svar_fresh (elements (free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2)) ≠ fresh_svar phi1

svar_is_fresh_in (svar_fresh (elements (free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2))) phi1
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
Hfreshy: svar_fresh (elements (free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2)) ≠ fresh_svar phi1

free_svars phi1 ⊆ ?B
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
Hfreshy: svar_fresh (elements (free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2)) ≠ fresh_svar phi1
svar_fresh (elements (free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2)) ∉ ?B
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
Hfreshy: svar_fresh (elements (free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2)) ≠ fresh_svar phi1

free_svars phi1 ⊆ free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
solve_free_svars_inclusion 5.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
phi_subst: Pattern
Heqphi_subst: phi_subst = phi1^[svar:S dbi↦phi2]
B: SVarSet
HeqB: B = free_svars phi_subst ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1

eval (update_svar_val (fresh_svar phi_subst) E ρ) phi_subst^{svar:0↦fresh_svar phi_subst} = eval (update_svar_val (fresh_svar phi1^{svar:S dbi↦X}) E (update_svar_val X (eval ρ phi2) ρ)) phi1^{svar:S dbi↦X}^{svar:0↦fresh_svar phi1^{svar:S dbi↦X}}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
phi_subst: Pattern
Heqphi_subst: phi_subst = phi1^[svar:S dbi↦phi2]
B: SVarSet
HeqB: B = free_svars phi_subst ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1

svar_is_fresh_in Y phi1^{svar:S dbi↦X}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
phi_subst: Pattern
Heqphi_subst: phi_subst = phi1^[svar:S dbi↦phi2]
B: SVarSet
HeqB: B = free_svars phi_subst ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
eval (update_svar_val (fresh_svar phi_subst) E ρ) phi_subst^{svar:0↦fresh_svar phi_subst} = eval (update_svar_val (fresh_svar phi1^{svar:S dbi↦X}) E (update_svar_val X (eval ρ phi2) ρ)) phi1^{svar:S dbi↦X}^{svar:0↦ fresh_svar phi1^{svar: S dbi↦X}}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
phi_subst: Pattern
Heqphi_subst: phi_subst = phi1^[svar:S dbi↦phi2]
B: SVarSet
HeqB: B = free_svars phi_subst ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1

svar_is_fresh_in Y phi1^{svar:S dbi↦X}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
Hfreshy': svar_is_fresh_in (svar_fresh (elements (free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2))) phi1
Hfreshy: svar_fresh (elements (free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2)) ≠ fresh_svar phi1

svar_is_fresh_in (svar_fresh (elements (free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2))) phi1^{svar:S dbi↦X}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
Hfreshy': svar_is_fresh_in (svar_fresh (elements (free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2))) phi1
Hfreshy: svar_fresh (elements (free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2)) ≠ fresh_svar phi1

free_svars phi1^{svar:S dbi↦X} ⊆ ?B
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
Hfreshy': svar_is_fresh_in (svar_fresh (elements (free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2))) phi1
Hfreshy: svar_fresh (elements (free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2)) ≠ fresh_svar phi1
svar_fresh (elements (free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2)) ∉ ?B
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
Hfreshy': svar_is_fresh_in (svar_fresh (elements (free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2))) phi1
Hfreshy: svar_fresh (elements (free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2)) ≠ fresh_svar phi1

free_svars phi1^{svar:S dbi↦X} ⊆ free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
solve_free_svars_inclusion 5.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
phi_subst: Pattern
Heqphi_subst: phi_subst = phi1^[svar:S dbi↦phi2]
B: SVarSet
HeqB: B = free_svars phi_subst ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}

eval (update_svar_val (fresh_svar phi_subst) E ρ) phi_subst^{svar:0↦fresh_svar phi_subst} = eval (update_svar_val (fresh_svar phi1^{svar:S dbi↦X}) E (update_svar_val X (eval ρ phi2) ρ)) phi1^{svar:S dbi↦X}^{svar:0↦fresh_svar phi1^{svar:S dbi↦X}}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
phi_subst: Pattern
Heqphi_subst: phi_subst = phi1^[svar:S dbi↦phi2]
B: SVarSet
HeqB: B = free_svars phi_subst ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}

Y ≠ X
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
phi_subst: Pattern
Heqphi_subst: phi_subst = phi1^[svar:S dbi↦phi2]
B: SVarSet
HeqB: B = free_svars phi_subst ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
eval (update_svar_val (fresh_svar phi_subst) E ρ) phi_subst^{svar:0↦fresh_svar phi_subst} = eval (update_svar_val (fresh_svar phi1^{svar:S dbi↦X}) E (update_svar_val X (eval ρ phi2) ρ)) phi1^{svar:S dbi↦X}^{svar:0↦ fresh_svar phi1^{svar: S dbi↦X}}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
phi_subst: Pattern
Heqphi_subst: phi_subst = phi1^[svar:S dbi↦phi2]
B: SVarSet
HeqB: B = free_svars phi_subst ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}

Y ≠ X
solve_fresh_svar_neq.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
phi_subst: Pattern
Heqphi_subst: phi_subst = phi1^[svar:S dbi↦phi2]
B: SVarSet
HeqB: B = free_svars phi_subst ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X

eval (update_svar_val (fresh_svar phi_subst) E ρ) phi_subst^{svar:0↦fresh_svar phi_subst} = eval (update_svar_val (fresh_svar phi1^{svar:S dbi↦X}) E (update_svar_val X (eval ρ phi2) ρ)) phi1^{svar:S dbi↦X}^{svar:0↦fresh_svar phi1^{svar:S dbi↦X}}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
phi_subst: Pattern
Heqphi_subst: phi_subst = phi1^[svar:S dbi↦phi2]
B: SVarSet
HeqB: B = free_svars phi_subst ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X

svar_is_fresh_in Y phi2
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
phi_subst: Pattern
Heqphi_subst: phi_subst = phi1^[svar:S dbi↦phi2]
B: SVarSet
HeqB: B = free_svars phi_subst ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
eval (update_svar_val (fresh_svar phi_subst) E ρ) phi_subst^{svar:0↦fresh_svar phi_subst} = eval (update_svar_val (fresh_svar phi1^{svar:S dbi↦X}) E (update_svar_val X (eval ρ phi2) ρ)) phi1^{svar:S dbi↦X}^{svar:0↦ fresh_svar phi1^{svar: S dbi↦X}}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
phi_subst: Pattern
Heqphi_subst: phi_subst = phi1^[svar:S dbi↦phi2]
B: SVarSet
HeqB: B = free_svars phi_subst ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X

svar_is_fresh_in Y phi2
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
Hfreshy''': svar_fresh (elements (free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2)) ≠ X
Hfreshy'': svar_is_fresh_in (svar_fresh (elements (free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2))) phi1^{svar:S dbi↦X}
Hfreshy': svar_is_fresh_in (svar_fresh (elements (free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2))) phi1
Hfreshy: svar_fresh (elements (free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2)) ≠ fresh_svar phi1

svar_is_fresh_in (svar_fresh (elements (free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2))) phi2
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
Hfreshy''': svar_fresh (elements (free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2)) ≠ X
Hfreshy'': svar_is_fresh_in (svar_fresh (elements (free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2))) phi1^{svar:S dbi↦X}
Hfreshy': svar_is_fresh_in (svar_fresh (elements (free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2))) phi1
Hfreshy: svar_fresh (elements (free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2)) ≠ fresh_svar phi1

free_svars phi2 ⊆ ?B
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
Hfreshy''': svar_fresh (elements (free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2)) ≠ X
Hfreshy'': svar_is_fresh_in (svar_fresh (elements (free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2))) phi1^{svar:S dbi↦X}
Hfreshy': svar_is_fresh_in (svar_fresh (elements (free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2))) phi1
Hfreshy: svar_fresh (elements (free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2)) ≠ fresh_svar phi1
svar_fresh (elements (free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2)) ∉ ?B
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
Hfreshy''': svar_fresh (elements (free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2)) ≠ X
Hfreshy'': svar_is_fresh_in (svar_fresh (elements (free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2))) phi1^{svar:S dbi↦X}
Hfreshy': svar_is_fresh_in (svar_fresh (elements (free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2))) phi1
Hfreshy: svar_fresh (elements (free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2)) ≠ fresh_svar phi1

free_svars phi2 ⊆ free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
solve_free_svars_inclusion 5.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
phi_subst: Pattern
Heqphi_subst: phi_subst = phi1^[svar:S dbi↦phi2]
B: SVarSet
HeqB: B = free_svars phi_subst ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2

eval (update_svar_val (fresh_svar phi_subst) E ρ) phi_subst^{svar:0↦fresh_svar phi_subst} = eval (update_svar_val (fresh_svar phi1^{svar:S dbi↦X}) E (update_svar_val X (eval ρ phi2) ρ)) phi1^{svar:S dbi↦X}^{svar:0↦fresh_svar phi1^{svar:S dbi↦X}}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
phi_subst: Pattern
Heqphi_subst: phi_subst = phi1^[svar:S dbi↦phi2]
B: SVarSet
HeqB: B = free_svars phi_subst ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2

svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
phi_subst: Pattern
Heqphi_subst: phi_subst = phi1^[svar:S dbi↦phi2]
B: SVarSet
HeqB: B = free_svars phi_subst ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
eval (update_svar_val (fresh_svar phi_subst) E ρ) phi_subst^{svar:0↦fresh_svar phi_subst} = eval (update_svar_val (fresh_svar phi1^{svar:S dbi↦X}) E (update_svar_val X (eval ρ phi2) ρ)) phi1^{svar:S dbi↦X}^{svar:0↦ fresh_svar phi1^{svar: S dbi↦X}}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
phi_subst: Pattern
Heqphi_subst: phi_subst = phi1^[svar:S dbi↦phi2]
B: SVarSet
HeqB: B = free_svars phi_subst ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2

svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
Hfreshy'''': svar_is_fresh_in (svar_fresh (elements (free_svars phi1^[svar: S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar: S dbi↦X} ∪ {[X]} ∪ free_svars phi2))) phi2
Hfreshy''': svar_fresh (elements (free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2)) ≠ X
Hfreshy'': svar_is_fresh_in (svar_fresh (elements (free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2))) phi1^{svar:S dbi↦X}
Hfreshy': svar_is_fresh_in (svar_fresh (elements (free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2))) phi1
Hfreshy: svar_fresh (elements (free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2)) ≠ fresh_svar phi1

svar_is_fresh_in (svar_fresh (elements (free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2))) phi1^[svar:S dbi↦phi2]
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
Hfreshy'''': svar_is_fresh_in (svar_fresh (elements (free_svars phi1^[svar: S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar: S dbi↦X} ∪ {[X]} ∪ free_svars phi2))) phi2
Hfreshy''': svar_fresh (elements (free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2)) ≠ X
Hfreshy'': svar_is_fresh_in (svar_fresh (elements (free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2))) phi1^{svar:S dbi↦X}
Hfreshy': svar_is_fresh_in (svar_fresh (elements (free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2))) phi1
Hfreshy: svar_fresh (elements (free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2)) ≠ fresh_svar phi1

free_svars phi1^[svar:S dbi↦phi2] ⊆ ?B
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
Hfreshy'''': svar_is_fresh_in (svar_fresh (elements (free_svars phi1^[svar: S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar: S dbi↦X} ∪ {[X]} ∪ free_svars phi2))) phi2
Hfreshy''': svar_fresh (elements (free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2)) ≠ X
Hfreshy'': svar_is_fresh_in (svar_fresh (elements (free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2))) phi1^{svar:S dbi↦X}
Hfreshy': svar_is_fresh_in (svar_fresh (elements (free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2))) phi1
Hfreshy: svar_fresh (elements (free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2)) ≠ fresh_svar phi1
svar_fresh (elements (free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2)) ∉ ?B
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
Hfreshy'''': svar_is_fresh_in (svar_fresh (elements (free_svars phi1^[svar: S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar: S dbi↦X} ∪ {[X]} ∪ free_svars phi2))) phi2
Hfreshy''': svar_fresh (elements (free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2)) ≠ X
Hfreshy'': svar_is_fresh_in (svar_fresh (elements (free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2))) phi1^{svar:S dbi↦X}
Hfreshy': svar_is_fresh_in (svar_fresh (elements (free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2))) phi1
Hfreshy: svar_fresh (elements (free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2)) ≠ fresh_svar phi1

free_svars phi1^[svar:S dbi↦phi2] ⊆ free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
solve_free_svars_inclusion 7.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
phi_subst: Pattern
Heqphi_subst: phi_subst = phi1^[svar:S dbi↦phi2]
B: SVarSet
HeqB: B = free_svars phi_subst ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]

eval (update_svar_val (fresh_svar phi_subst) E ρ) phi_subst^{svar:0↦fresh_svar phi_subst} = eval (update_svar_val (fresh_svar phi1^{svar:S dbi↦X}) E (update_svar_val X (eval ρ phi2) ρ)) phi1^{svar:S dbi↦X}^{svar:0↦fresh_svar phi1^{svar:S dbi↦X}}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
phi_subst: Pattern
Heqphi_subst: phi_subst = phi1^[svar:S dbi↦phi2]
B: SVarSet
HeqB: B = free_svars phi_subst ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
Hoc: bool
HeqHoc: Hoc = bsvar_occur phi1 (S dbi)

eval (update_svar_val (fresh_svar phi_subst) E ρ) phi_subst^{svar:0↦fresh_svar phi_subst} = eval (update_svar_val (fresh_svar phi1^{svar:S dbi↦X}) E (update_svar_val X (eval ρ phi2) ρ)) phi1^{svar:S dbi↦X}^{svar:0↦fresh_svar phi1^{svar:S dbi↦X}}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
phi_subst: Pattern
Heqphi_subst: phi_subst = phi1^[svar:S dbi↦phi2]
B: SVarSet
HeqB: B = free_svars phi_subst ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: true = bsvar_occur phi1 (S dbi)

eval (update_svar_val (fresh_svar phi_subst) E ρ) phi_subst^{svar:0↦fresh_svar phi_subst} = eval (update_svar_val (fresh_svar phi1^{svar:S dbi↦X}) E (update_svar_val X (eval ρ phi2) ρ)) phi1^{svar:S dbi↦X}^{svar:0↦fresh_svar phi1^{svar:S dbi↦X}}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
phi_subst: Pattern
Heqphi_subst: phi_subst = phi1^[svar:S dbi↦phi2]
B: SVarSet
HeqB: B = free_svars phi_subst ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: false = bsvar_occur phi1 (S dbi)
eval (update_svar_val (fresh_svar phi_subst) E ρ) phi_subst^{svar:0↦fresh_svar phi_subst} = eval (update_svar_val (fresh_svar phi1^{svar:S dbi↦X}) E (update_svar_val X (eval ρ phi2) ρ)) phi1^{svar:S dbi↦X}^{svar:0↦ fresh_svar phi1^{svar: S dbi↦X}}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
phi_subst: Pattern
Heqphi_subst: phi_subst = phi1^[svar:S dbi↦phi2]
B: SVarSet
HeqB: B = free_svars phi_subst ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: true = bsvar_occur phi1 (S dbi)

eval (update_svar_val (fresh_svar phi_subst) E ρ) phi_subst^{svar:0↦fresh_svar phi_subst} = eval (update_svar_val (fresh_svar phi1^{svar:S dbi↦X}) E (update_svar_val X (eval ρ phi2) ρ)) phi1^{svar:S dbi↦X}^{svar:0↦fresh_svar phi1^{svar:S dbi↦X}}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
B: SVarSet
HeqB: B = free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: true = bsvar_occur phi1 (S dbi)

eval (update_svar_val (fresh_svar phi1^[svar:S dbi↦phi2]) E ρ) phi1^[svar:S dbi↦phi2]^{svar:0↦fresh_svar phi1^[svar:S dbi↦phi2]} = eval (update_svar_val (fresh_svar phi1^{svar:S dbi↦X}) E (update_svar_val X (eval ρ phi2) ρ)) phi1^{svar:S dbi↦X}^{svar:0↦fresh_svar phi1^{svar:S dbi↦X}}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
B: SVarSet
HeqB: B = free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: true = bsvar_occur phi1 (S dbi)

svar_is_fresh_in (fresh_svar phi1^{svar:S dbi↦X}) phi1^{svar:S dbi↦X}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
B: SVarSet
HeqB: B = free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: true = bsvar_occur phi1 (S dbi)
svar_is_fresh_in Y phi1^{svar:S dbi↦X}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
B: SVarSet
HeqB: B = free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: true = bsvar_occur phi1 (S dbi)
eval (update_svar_val (fresh_svar phi1^[svar:S dbi↦phi2]) E ρ) phi1^[svar:S dbi↦phi2]^{svar:0↦ fresh_svar phi1^[svar: S dbi↦phi2]} = eval (update_svar_val Y E (update_svar_val X (eval ρ phi2) ρ)) phi1^{svar:S dbi↦X}^{svar:0↦Y}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
B: SVarSet
HeqB: B = free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: true = bsvar_occur phi1 (S dbi)

svar_is_fresh_in (fresh_svar phi1^{svar:S dbi↦X}) phi1^{svar:S dbi↦X}
apply set_svar_fresh_is_fresh.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
B: SVarSet
HeqB: B = free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: true = bsvar_occur phi1 (S dbi)

svar_is_fresh_in Y phi1^{svar:S dbi↦X}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
B: SVarSet
HeqB: B = free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: true = bsvar_occur phi1 (S dbi)
eval (update_svar_val (fresh_svar phi1^[svar:S dbi↦phi2]) E ρ) phi1^[svar:S dbi↦phi2]^{svar:0↦ fresh_svar phi1^[svar: S dbi↦phi2]} = eval (update_svar_val Y E (update_svar_val X (eval ρ phi2) ρ)) phi1^{svar:S dbi↦X}^{svar:0↦Y}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
B: SVarSet
HeqB: B = free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: true = bsvar_occur phi1 (S dbi)

svar_is_fresh_in Y phi1^{svar:S dbi↦X}
apply Hfreshy''.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
B: SVarSet
HeqB: B = free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: true = bsvar_occur phi1 (S dbi)

eval (update_svar_val (fresh_svar phi1^[svar:S dbi↦phi2]) E ρ) phi1^[svar:S dbi↦phi2]^{svar:0↦fresh_svar phi1^[svar:S dbi↦phi2]} = eval (update_svar_val Y E (update_svar_val X (eval ρ phi2) ρ)) phi1^{svar:S dbi↦X}^{svar:0↦Y}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
B: SVarSet
HeqB: B = free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: true = bsvar_occur phi1 (S dbi)

Y ≠ X
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
B: SVarSet
HeqB: B = free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: true = bsvar_occur phi1 (S dbi)
eval (update_svar_val (fresh_svar phi1^[svar:S dbi↦phi2]) E ρ) phi1^[svar:S dbi↦phi2]^{svar:0↦ fresh_svar phi1^[svar: S dbi↦phi2]} = eval (update_svar_val X (eval ρ phi2) (update_svar_val Y E ρ)) phi1^{svar:S dbi↦X}^{svar:0↦Y}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
B: SVarSet
HeqB: B = free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: true = bsvar_occur phi1 (S dbi)

Y ≠ X
apply Hfreshy'''.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
B: SVarSet
HeqB: B = free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: true = bsvar_occur phi1 (S dbi)

eval (update_svar_val (fresh_svar phi1^[svar:S dbi↦phi2]) E ρ) phi1^[svar:S dbi↦phi2]^{svar:0↦fresh_svar phi1^[svar:S dbi↦phi2]} = eval (update_svar_val X (eval ρ phi2) (update_svar_val Y E ρ)) phi1^{svar:S dbi↦X}^{svar:0↦Y}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
B: SVarSet
HeqB: B = free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: true = bsvar_occur phi1 (S dbi)

0 < S dbi
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
B: SVarSet
HeqB: B = free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: true = bsvar_occur phi1 (S dbi)
eval (update_svar_val (fresh_svar phi1^[svar:S dbi↦phi2]) E ρ) phi1^[svar:S dbi↦phi2]^{svar:0↦ fresh_svar phi1^[svar: S dbi↦phi2]} = eval (update_svar_val X (eval ρ phi2) (update_svar_val Y E ρ)) phi1^{svar:0↦Y}^{svar: Init.Nat.pred (S dbi)↦X}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
B: SVarSet
HeqB: B = free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: true = bsvar_occur phi1 (S dbi)

0 < S dbi
lia.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
B: SVarSet
HeqB: B = free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: true = bsvar_occur phi1 (S dbi)

eval (update_svar_val (fresh_svar phi1^[svar:S dbi↦phi2]) E ρ) phi1^[svar:S dbi↦phi2]^{svar:0↦fresh_svar phi1^[svar:S dbi↦phi2]} = eval (update_svar_val X (eval ρ phi2) (update_svar_val Y E ρ)) phi1^{svar:0↦Y}^{svar:Init.Nat.pred (S dbi)↦X}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
B: SVarSet
HeqB: B = free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: true = bsvar_occur phi1 (S dbi)

eval (update_svar_val (fresh_svar phi1^[svar:S dbi↦phi2]) E ρ) phi1^[svar:S dbi↦phi2]^{svar:0↦fresh_svar phi1^[svar:S dbi↦phi2]} = eval (update_svar_val X (eval ρ phi2) (update_svar_val Y E ρ)) phi1^{svar:0↦Y}^{svar:dbi↦X}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
B: SVarSet
HeqB: B = free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: true = bsvar_occur phi1 (S dbi)

eval (update_svar_val (fresh_svar phi1^[svar:S dbi↦phi2]) E ρ) phi1^[svar:S dbi↦phi2]^{svar:0↦fresh_svar phi1^[svar:S dbi↦phi2]} = eval (update_svar_val X (eval (update_svar_val Y E ρ) phi2) (update_svar_val Y E ρ)) phi1^{svar:0↦Y}^{svar:dbi↦X}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
B: SVarSet
HeqB: B = free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: true = bsvar_occur phi1 (S dbi)
eval (update_svar_val Y E ρ) phi2 = eval ρ phi2
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
B: SVarSet
HeqB: B = free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: true = bsvar_occur phi1 (S dbi)

eval (update_svar_val Y E ρ) phi2 = eval ρ phi2
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
B: SVarSet
HeqB: B = free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: true = bsvar_occur phi1 (S dbi)

svar_is_fresh_in Y phi2
apply Hfreshy''''.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
B: SVarSet
HeqB: B = free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: true = bsvar_occur phi1 (S dbi)

eval (update_svar_val (fresh_svar phi1^[svar:S dbi↦phi2]) E ρ) phi1^[svar:S dbi↦phi2]^{svar:0↦fresh_svar phi1^[svar:S dbi↦phi2]} = eval (update_svar_val X (eval (update_svar_val Y E ρ) phi2) (update_svar_val Y E ρ)) phi1^{svar:0↦Y}^{svar:dbi↦X}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
B: SVarSet
HeqB: B = free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: true = bsvar_occur phi1 (S dbi)

eval (update_svar_val (fresh_svar phi1^[svar:S dbi↦phi2]) E ρ) phi1^[svar:S dbi↦phi2]^{svar:0↦fresh_svar phi1^[svar:S dbi↦phi2]} = eval (update_svar_val Y E ρ) phi1^{svar:0↦Y}^[svar:dbi↦phi2]
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
B: SVarSet
HeqB: B = free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: true = bsvar_occur phi1 (S dbi)
size phi1^{svar:0↦Y} ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
B: SVarSet
HeqB: B = free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: true = bsvar_occur phi1 (S dbi)
well_formed_closed phi2
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
B: SVarSet
HeqB: B = free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: true = bsvar_occur phi1 (S dbi)
well_formed_closed_mu_aux phi1^{svar:0↦Y} (S dbi)
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
B: SVarSet
HeqB: B = free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: true = bsvar_occur phi1 (S dbi)
X ∉ free_svars phi1^{svar:0↦Y}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
B: SVarSet
HeqB: B = free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: true = bsvar_occur phi1 (S dbi)

well_formed_closed_mu_aux phi1^{svar:0↦Y} (S dbi)
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
B: SVarSet
HeqB: B = free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: true = bsvar_occur phi1 (S dbi)

0 ≤ S dbi
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
B: SVarSet
HeqB: B = free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: true = bsvar_occur phi1 (S dbi)
well_formed_closed_mu_aux phi1 (S (S dbi)) = true
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
B: SVarSet
HeqB: B = free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: true = bsvar_occur phi1 (S dbi)

well_formed_closed_mu_aux phi1 (S (S dbi)) = true
auto.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
B: SVarSet
HeqB: B = free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: true = bsvar_occur phi1 (S dbi)

eval (update_svar_val (fresh_svar phi1^[svar:S dbi↦phi2]) E ρ) phi1^[svar:S dbi↦phi2]^{svar:0↦fresh_svar phi1^[svar:S dbi↦phi2]} = eval (update_svar_val Y E ρ) phi1^{svar:0↦Y}^[svar:dbi↦phi2]
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
B: SVarSet
HeqB: B = free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: true = bsvar_occur phi1 (S dbi)
size phi1^{svar:0↦Y} ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
B: SVarSet
HeqB: B = free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: true = bsvar_occur phi1 (S dbi)
well_formed_closed phi2
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
B: SVarSet
HeqB: B = free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: true = bsvar_occur phi1 (S dbi)
X ∉ free_svars phi1^{svar:0↦Y}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
B: SVarSet
HeqB: B = free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: true = bsvar_occur phi1 (S dbi)

X ∉ free_svars phi1^{svar:0↦Y}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
B: SVarSet
HeqB: B = free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: true = bsvar_occur phi1 (S dbi)

X ≠ Y
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
B: SVarSet
HeqB: B = free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: true = bsvar_occur phi1 (S dbi)
svar_is_fresh_in X phi1
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
B: SVarSet
HeqB: B = free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: true = bsvar_occur phi1 (S dbi)

Y ≠ X
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
B: SVarSet
HeqB: B = free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: true = bsvar_occur phi1 (S dbi)
svar_is_fresh_in X phi1
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
B: SVarSet
HeqB: B = free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: true = bsvar_occur phi1 (S dbi)

svar_is_fresh_in X phi1
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars phi1
E: propset M
B: SVarSet
HeqB: B = free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: true = bsvar_occur phi1 (S dbi)

svar_is_fresh_in X phi1
apply H.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
B: SVarSet
HeqB: B = free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: true = bsvar_occur phi1 (S dbi)

eval (update_svar_val (fresh_svar phi1^[svar:S dbi↦phi2]) E ρ) phi1^[svar:S dbi↦phi2]^{svar:0↦fresh_svar phi1^[svar:S dbi↦phi2]} = eval (update_svar_val Y E ρ) phi1^{svar:0↦Y}^[svar:dbi↦phi2]
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
B: SVarSet
HeqB: B = free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: true = bsvar_occur phi1 (S dbi)
size phi1^{svar:0↦Y} ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
B: SVarSet
HeqB: B = free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: true = bsvar_occur phi1 (S dbi)
well_formed_closed phi2
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
B: SVarSet
HeqB: B = free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: true = bsvar_occur phi1 (S dbi)

well_formed_closed phi2
apply Hwfc2.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
B: SVarSet
HeqB: B = free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: true = bsvar_occur phi1 (S dbi)

eval (update_svar_val (fresh_svar phi1^[svar:S dbi↦phi2]) E ρ) phi1^[svar:S dbi↦phi2]^{svar:0↦fresh_svar phi1^[svar:S dbi↦phi2]} = eval (update_svar_val Y E ρ) phi1^{svar:0↦Y}^[svar:dbi↦phi2]
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
B: SVarSet
HeqB: B = free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: true = bsvar_occur phi1 (S dbi)
size phi1^{svar:0↦Y} ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
B: SVarSet
HeqB: B = free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: true = bsvar_occur phi1 (S dbi)

size phi1^{svar:0↦Y} ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
B: SVarSet
HeqB: B = free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: true = bsvar_occur phi1 (S dbi)

size phi1 ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
B: SVarSet
HeqB: B = free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: true = bsvar_occur phi1 (S dbi)

size phi1 ≤ sz
lia.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
B: SVarSet
HeqB: B = free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: true = bsvar_occur phi1 (S dbi)

eval (update_svar_val (fresh_svar phi1^[svar:S dbi↦phi2]) E ρ) phi1^[svar:S dbi↦phi2]^{svar:0↦fresh_svar phi1^[svar:S dbi↦phi2]} = eval (update_svar_val Y E ρ) phi1^{svar:0↦Y}^[svar:dbi↦phi2]
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
B: SVarSet
HeqB: B = free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: true = bsvar_occur phi1 (S dbi)

well_formed_closed phi2
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
B: SVarSet
HeqB: B = free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: true = bsvar_occur phi1 (S dbi)
0 < S dbi
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
B: SVarSet
HeqB: B = free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: true = bsvar_occur phi1 (S dbi)
eval (update_svar_val (fresh_svar phi1^[svar:S dbi↦phi2]) E ρ) phi1^{svar:0↦fresh_svar phi1^[svar:S dbi↦phi2]}^[svar: Init.Nat.pred (S dbi)↦phi2] = eval (update_svar_val Y E ρ) phi1^{svar:0↦Y}^[svar:dbi↦phi2]
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
B: SVarSet
HeqB: B = free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: true = bsvar_occur phi1 (S dbi)

well_formed_closed phi2
apply Hwfc2.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
B: SVarSet
HeqB: B = free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: true = bsvar_occur phi1 (S dbi)

0 < S dbi
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
B: SVarSet
HeqB: B = free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: true = bsvar_occur phi1 (S dbi)
eval (update_svar_val (fresh_svar phi1^[svar:S dbi↦phi2]) E ρ) phi1^{svar:0↦fresh_svar phi1^[svar:S dbi↦phi2]}^[svar: Init.Nat.pred (S dbi)↦phi2] = eval (update_svar_val Y E ρ) phi1^{svar:0↦Y}^[svar:dbi↦phi2]
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
B: SVarSet
HeqB: B = free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: true = bsvar_occur phi1 (S dbi)

0 < S dbi
lia.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
B: SVarSet
HeqB: B = free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: true = bsvar_occur phi1 (S dbi)

eval (update_svar_val (fresh_svar phi1^[svar:S dbi↦phi2]) E ρ) phi1^{svar:0↦fresh_svar phi1^[svar:S dbi↦phi2]}^[svar: Init.Nat.pred (S dbi)↦phi2] = eval (update_svar_val Y E ρ) phi1^{svar:0↦Y}^[svar:dbi↦phi2]
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
B: SVarSet
HeqB: B = free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: true = bsvar_occur phi1 (S dbi)
X': svar
HeqX': X' = fresh_svar phi1^[svar:S dbi↦phi2]

eval (update_svar_val X' E ρ) phi1^{svar:0↦X'}^[svar:Init.Nat.pred (S dbi)↦phi2] = eval (update_svar_val Y E ρ) phi1^{svar:0↦Y}^[svar:dbi↦phi2]
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
B: SVarSet
HeqB: B = free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: true = bsvar_occur phi1 (S dbi)
X': svar
HeqX': X' = fresh_svar phi1^[svar:S dbi↦phi2]

well_formed_closed phi2
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
B: SVarSet
HeqB: B = free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: true = bsvar_occur phi1 (S dbi)
X': svar
HeqX': X' = fresh_svar phi1^[svar:S dbi↦phi2]
0 < S dbi
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
B: SVarSet
HeqB: B = free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: true = bsvar_occur phi1 (S dbi)
X': svar
HeqX': X' = fresh_svar phi1^[svar:S dbi↦phi2]
eval (update_svar_val X' E ρ) phi1^[svar:S dbi↦phi2]^{svar:0↦X'} = eval (update_svar_val Y E ρ) phi1^{svar:0↦Y}^[svar:dbi↦phi2]
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
B: SVarSet
HeqB: B = free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: true = bsvar_occur phi1 (S dbi)
X': svar
HeqX': X' = fresh_svar phi1^[svar:S dbi↦phi2]

well_formed_closed phi2
apply Hwfc2.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
B: SVarSet
HeqB: B = free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: true = bsvar_occur phi1 (S dbi)
X': svar
HeqX': X' = fresh_svar phi1^[svar:S dbi↦phi2]

0 < S dbi
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
B: SVarSet
HeqB: B = free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: true = bsvar_occur phi1 (S dbi)
X': svar
HeqX': X' = fresh_svar phi1^[svar:S dbi↦phi2]
eval (update_svar_val X' E ρ) phi1^[svar:S dbi↦phi2]^{svar:0↦X'} = eval (update_svar_val Y E ρ) phi1^{svar:0↦Y}^[svar:dbi↦phi2]
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
B: SVarSet
HeqB: B = free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: true = bsvar_occur phi1 (S dbi)
X': svar
HeqX': X' = fresh_svar phi1^[svar:S dbi↦phi2]

0 < S dbi
lia.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
B: SVarSet
HeqB: B = free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: true = bsvar_occur phi1 (S dbi)
X': svar
HeqX': X' = fresh_svar phi1^[svar:S dbi↦phi2]

eval (update_svar_val X' E ρ) phi1^[svar:S dbi↦phi2]^{svar:0↦X'} = eval (update_svar_val Y E ρ) phi1^{svar:0↦Y}^[svar:dbi↦phi2]
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
B: SVarSet
HeqB: B = free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: true = bsvar_occur phi1 (S dbi)
X': svar
HeqX': X' = fresh_svar phi1^[svar:S dbi↦phi2]

eval (update_svar_val X' E ρ) phi1^[svar:S (Init.Nat.pred (S dbi))↦phi2]^{svar:0↦X'} = eval (update_svar_val Y E ρ) phi1^{svar:0↦Y}^[svar:Init.Nat.pred (S dbi)↦phi2]
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
B: SVarSet
HeqB: B = free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: true = bsvar_occur phi1 (S dbi)
X': svar
HeqX': X' = fresh_svar phi1^[svar:S dbi↦phi2]

eval (update_svar_val X' E ρ) phi1^[svar:S (Init.Nat.pred (S dbi))↦phi2]^{svar:0↦X'} = eval (update_svar_val Y E ρ) phi1^[svar:S dbi↦phi2]^{svar:0↦Y}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
B: SVarSet
HeqB: B = free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: true = bsvar_occur phi1 (S dbi)
X': svar
HeqX': X' = fresh_svar phi1^[svar:S dbi↦phi2]
well_formed_closed phi2
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
B: SVarSet
HeqB: B = free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: true = bsvar_occur phi1 (S dbi)
X': svar
HeqX': X' = fresh_svar phi1^[svar:S dbi↦phi2]
0 < S dbi
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
B: SVarSet
HeqB: B = free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: true = bsvar_occur phi1 (S dbi)
X': svar
HeqX': X' = fresh_svar phi1^[svar:S dbi↦phi2]

well_formed_closed phi2
apply Hwfc2.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
B: SVarSet
HeqB: B = free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: true = bsvar_occur phi1 (S dbi)
X': svar
HeqX': X' = fresh_svar phi1^[svar:S dbi↦phi2]

eval (update_svar_val X' E ρ) phi1^[svar:S (Init.Nat.pred (S dbi))↦phi2]^{svar:0↦X'} = eval (update_svar_val Y E ρ) phi1^[svar:S dbi↦phi2]^{svar:0↦Y}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
B: SVarSet
HeqB: B = free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: true = bsvar_occur phi1 (S dbi)
X': svar
HeqX': X' = fresh_svar phi1^[svar:S dbi↦phi2]
0 < S dbi
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
B: SVarSet
HeqB: B = free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: true = bsvar_occur phi1 (S dbi)
X': svar
HeqX': X' = fresh_svar phi1^[svar:S dbi↦phi2]

0 < S dbi
lia.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
B: SVarSet
HeqB: B = free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: true = bsvar_occur phi1 (S dbi)
X': svar
HeqX': X' = fresh_svar phi1^[svar:S dbi↦phi2]

eval (update_svar_val X' E ρ) phi1^[svar:S (Init.Nat.pred (S dbi))↦phi2]^{svar:0↦X'} = eval (update_svar_val Y E ρ) phi1^[svar:S dbi↦phi2]^{svar:0↦Y}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
B: SVarSet
HeqB: B = free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: true = bsvar_occur phi1 (S dbi)
X': svar
HeqX': X' = fresh_svar phi1^[svar:S dbi↦phi2]

eval (update_svar_val X' E ρ) phi1^[svar:S dbi↦phi2]^{svar:0↦X'} = eval (update_svar_val Y E ρ) phi1^[svar:S dbi↦phi2]^{svar:0↦Y}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
B: SVarSet
HeqB: B = free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: true = bsvar_occur phi1 (S dbi)
X': svar
HeqX': X' = fresh_svar phi1^[svar:S dbi↦phi2]

svar_is_fresh_in X' phi1^[svar:S dbi↦phi2]
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
B: SVarSet
HeqB: B = free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: true = bsvar_occur phi1 (S dbi)
X': svar
HeqX': X' = fresh_svar phi1^[svar:S dbi↦phi2]
svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
B: SVarSet
HeqB: B = free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: true = bsvar_occur phi1 (S dbi)
X': svar
HeqX': X' = fresh_svar phi1^[svar:S dbi↦phi2]

svar_is_fresh_in X' phi1^[svar:S dbi↦phi2]
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
B: SVarSet
HeqB: B = free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: true = bsvar_occur phi1 (S dbi)

svar_is_fresh_in (fresh_svar phi1^[svar:S dbi↦phi2]) phi1^[svar:S dbi↦phi2]
apply set_svar_fresh_is_fresh.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
B: SVarSet
HeqB: B = free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: true = bsvar_occur phi1 (S dbi)
X': svar
HeqX': X' = fresh_svar phi1^[svar:S dbi↦phi2]

svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
B: SVarSet
HeqB: B = free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: true = bsvar_occur phi1 (S dbi)
X': svar
HeqX': X' = fresh_svar phi1^[svar:S dbi↦phi2]

svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
apply Hfreshy5. }
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
phi_subst: Pattern
Heqphi_subst: phi_subst = phi1^[svar:S dbi↦phi2]
B: SVarSet
HeqB: B = free_svars phi_subst ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: false = bsvar_occur phi1 (S dbi)

eval (update_svar_val (fresh_svar phi_subst) E ρ) phi_subst^{svar:0↦fresh_svar phi_subst} = eval (update_svar_val (fresh_svar phi1^{svar:S dbi↦X}) E (update_svar_val X (eval ρ phi2) ρ)) phi1^{svar:S dbi↦X}^{svar:0↦fresh_svar phi1^{svar:S dbi↦X}}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
phi_subst: Pattern
Heqphi_subst: phi_subst = phi1^[svar:S dbi↦phi2]
B: SVarSet
HeqB: B = free_svars phi_subst ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: false = bsvar_occur phi1 (S dbi)

eval (update_svar_val (fresh_svar phi1^[svar:S dbi↦phi2]) E ρ) phi1^[svar:S dbi↦phi2]^{svar:0↦fresh_svar phi1^[svar:S dbi↦phi2]} = eval (update_svar_val (fresh_svar phi1^{svar:S dbi↦X}) E (update_svar_val X (eval ρ phi2) ρ)) phi1^{svar:S dbi↦X}^{svar:0↦fresh_svar phi1^{svar:S dbi↦X}}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
phi_subst: Pattern
Heqphi_subst: phi_subst = phi1^[svar:S dbi↦phi2]
B: SVarSet
HeqB: B = free_svars phi_subst ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: false = bsvar_occur phi1 (S dbi)

well_formed_closed_mu_aux phi1 (S dbi)
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
phi_subst: Pattern
Heqphi_subst: phi_subst = phi1^[svar:S dbi↦phi2]
B: SVarSet
HeqB: B = free_svars phi_subst ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: false = bsvar_occur phi1 (S dbi)
eval (update_svar_val (fresh_svar phi1) E ρ) phi1^{svar:0↦fresh_svar phi1} = eval (update_svar_val (fresh_svar phi1^{svar:S dbi↦X}) E (update_svar_val X (eval ρ phi2) ρ)) phi1^{svar:S dbi↦X}^{svar:0↦ fresh_svar phi1^{svar: S dbi↦X}}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
phi_subst: Pattern
Heqphi_subst: phi_subst = phi1^[svar:S dbi↦phi2]
B: SVarSet
HeqB: B = free_svars phi_subst ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: false = bsvar_occur phi1 (S dbi)

well_formed_closed_mu_aux phi1 (S dbi)
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
phi_subst: Pattern
Heqphi_subst: phi_subst = phi1^[svar:S dbi↦phi2]
B: SVarSet
HeqB: B = free_svars phi_subst ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: false = bsvar_occur phi1 (S dbi)
eval (update_svar_val (fresh_svar phi1) E ρ) phi1^{svar:0↦fresh_svar phi1} = eval (update_svar_val (fresh_svar phi1^{svar:S dbi↦X}) E (update_svar_val X (eval ρ phi2) ρ)) phi1^{svar:S dbi↦X}^{svar:0↦ fresh_svar phi1^{svar: S dbi↦X}}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
phi_subst: Pattern
B: SVarSet
HeqB: B = free_svars phi_subst ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: false = bsvar_occur phi1 (S dbi)

well_formed_closed_mu_aux phi1 (S dbi)
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
phi_subst: Pattern
B: SVarSet
HeqB: B = free_svars phi_subst ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: false = bsvar_occur phi1 (S dbi)
Heqphi_subst: phi_subst = phi1
well_formed_closed_mu_aux phi1 (S dbi)
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
phi_subst: Pattern
Heqphi_subst: phi_subst = phi1^[svar:S dbi↦phi2]
B: SVarSet
HeqB: B = free_svars phi_subst ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: false = bsvar_occur phi1 (S dbi)
eval (update_svar_val (fresh_svar phi1) E ρ) phi1^{svar:0↦fresh_svar phi1} = eval (update_svar_val (fresh_svar phi1^{svar:S dbi↦X}) E (update_svar_val X (eval ρ phi2) ρ)) phi1^{svar:S dbi↦X}^{svar:0↦ fresh_svar phi1^{svar: S dbi↦X}}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
phi_subst: Pattern
B: SVarSet
HeqB: B = free_svars phi_subst ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: false = bsvar_occur phi1 (S dbi)

well_formed_closed_mu_aux phi1 (S dbi)
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
phi_subst: Pattern
B: SVarSet
HeqB: B = free_svars phi_subst ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: false = bsvar_occur phi1 (S dbi)
Heqphi_subst: phi_subst = phi1
well_formed_closed_mu_aux phi1 (S dbi)
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
phi_subst: Pattern
Heqphi_subst: phi_subst = phi1^[svar:S dbi↦phi2]
B: SVarSet
HeqB: B = free_svars phi_subst ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: false = bsvar_occur phi1 (S dbi)
eval (update_svar_val (fresh_svar phi1) E ρ) phi1^{svar:0↦fresh_svar phi1} = eval (update_svar_val (fresh_svar phi1^{svar:S dbi↦X}) E (update_svar_val X (eval ρ phi2) ρ)) phi1^{svar:S dbi↦X}^{svar:0↦ fresh_svar phi1^{svar: S dbi↦X}}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
phi_subst: Pattern
Heqphi_subst: phi_subst = phi1^[svar:S dbi↦phi2]
B: SVarSet
HeqB: B = free_svars phi_subst ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: false = bsvar_occur phi1 (S dbi)

eval (update_svar_val (fresh_svar phi1) E ρ) phi1^{svar:0↦fresh_svar phi1} = eval (update_svar_val (fresh_svar phi1^{svar:S dbi↦X}) E (update_svar_val X (eval ρ phi2) ρ)) phi1^{svar:S dbi↦X}^{svar:0↦fresh_svar phi1^{svar:S dbi↦X}}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
phi_subst: Pattern
Heqphi_subst: phi_subst = phi1^[svar:S dbi↦phi2]
B: SVarSet
HeqB: B = free_svars phi_subst ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: false = bsvar_occur phi1 (S dbi)

eval (update_svar_val Y E ρ) phi1^{svar:0↦Y} = eval (update_svar_val (fresh_svar phi1^{svar:S dbi↦X}) E (update_svar_val X (eval ρ phi2) ρ)) phi1^{svar:S dbi↦X}^{svar:0↦fresh_svar phi1^{svar:S dbi↦X}}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
phi_subst: Pattern
Heqphi_subst: phi_subst = phi1^[svar:S dbi↦phi2]
B: SVarSet
HeqB: B = free_svars phi_subst ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: false = bsvar_occur phi1 (S dbi)
svar_is_fresh_in (fresh_svar phi1) phi1
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
phi_subst: Pattern
Heqphi_subst: phi_subst = phi1^[svar:S dbi↦phi2]
B: SVarSet
HeqB: B = free_svars phi_subst ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: false = bsvar_occur phi1 (S dbi)
svar_is_fresh_in Y phi1
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
phi_subst: Pattern
Heqphi_subst: phi_subst = phi1^[svar:S dbi↦phi2]
B: SVarSet
HeqB: B = free_svars phi_subst ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: false = bsvar_occur phi1 (S dbi)

svar_is_fresh_in (fresh_svar phi1) phi1
apply set_svar_fresh_is_fresh.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
phi_subst: Pattern
Heqphi_subst: phi_subst = phi1^[svar:S dbi↦phi2]
B: SVarSet
HeqB: B = free_svars phi_subst ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: false = bsvar_occur phi1 (S dbi)

eval (update_svar_val Y E ρ) phi1^{svar:0↦Y} = eval (update_svar_val (fresh_svar phi1^{svar:S dbi↦X}) E (update_svar_val X (eval ρ phi2) ρ)) phi1^{svar:S dbi↦X}^{svar:0↦fresh_svar phi1^{svar:S dbi↦X}}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
phi_subst: Pattern
Heqphi_subst: phi_subst = phi1^[svar:S dbi↦phi2]
B: SVarSet
HeqB: B = free_svars phi_subst ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: false = bsvar_occur phi1 (S dbi)
svar_is_fresh_in Y phi1
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
phi_subst: Pattern
Heqphi_subst: phi_subst = phi1^[svar:S dbi↦phi2]
B: SVarSet
HeqB: B = free_svars phi_subst ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: false = bsvar_occur phi1 (S dbi)

svar_is_fresh_in Y phi1
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
Hfreshy5: svar_is_fresh_in (svar_fresh (elements (free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2))) phi1^[svar:S dbi↦phi2]
Hfreshy'''': svar_is_fresh_in (svar_fresh (elements (free_svars phi1^[svar: S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar: S dbi↦X} ∪ {[X]} ∪ free_svars phi2))) phi2
Hfreshy''': svar_fresh (elements (free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2)) ≠ X
Hfreshy'': svar_is_fresh_in (svar_fresh (elements (free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2))) phi1^{svar:S dbi↦X}
Hfreshy': svar_is_fresh_in (svar_fresh (elements (free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2))) phi1
Hfreshy: svar_fresh (elements (free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2)) ≠ fresh_svar phi1
HeqHoc: false = bsvar_occur phi1 (S dbi)

svar_is_fresh_in (svar_fresh (elements (free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2))) phi1
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
Hfreshy5: svar_is_fresh_in (svar_fresh (elements (free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2))) phi1^[svar:S dbi↦phi2]
Hfreshy'''': svar_is_fresh_in (svar_fresh (elements (free_svars phi1^[svar: S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar: S dbi↦X} ∪ {[X]} ∪ free_svars phi2))) phi2
Hfreshy''': svar_fresh (elements (free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2)) ≠ X
Hfreshy'': svar_is_fresh_in (svar_fresh (elements (free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2))) phi1^{svar:S dbi↦X}
Hfreshy': svar_is_fresh_in (svar_fresh (elements (free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2))) phi1
Hfreshy: svar_fresh (elements (free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2)) ≠ fresh_svar phi1
HeqHoc: false = bsvar_occur phi1 (S dbi)

free_svars phi1 ⊆ ?B
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
Hfreshy5: svar_is_fresh_in (svar_fresh (elements (free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2))) phi1^[svar:S dbi↦phi2]
Hfreshy'''': svar_is_fresh_in (svar_fresh (elements (free_svars phi1^[svar: S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar: S dbi↦X} ∪ {[X]} ∪ free_svars phi2))) phi2
Hfreshy''': svar_fresh (elements (free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2)) ≠ X
Hfreshy'': svar_is_fresh_in (svar_fresh (elements (free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2))) phi1^{svar:S dbi↦X}
Hfreshy': svar_is_fresh_in (svar_fresh (elements (free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2))) phi1
Hfreshy: svar_fresh (elements (free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2)) ≠ fresh_svar phi1
HeqHoc: false = bsvar_occur phi1 (S dbi)
svar_fresh (elements (free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2)) ∉ ?B
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
Hfreshy5: svar_is_fresh_in (svar_fresh (elements (free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2))) phi1^[svar:S dbi↦phi2]
Hfreshy'''': svar_is_fresh_in (svar_fresh (elements (free_svars phi1^[svar: S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar: S dbi↦X} ∪ {[X]} ∪ free_svars phi2))) phi2
Hfreshy''': svar_fresh (elements (free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2)) ≠ X
Hfreshy'': svar_is_fresh_in (svar_fresh (elements (free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2))) phi1^{svar:S dbi↦X}
Hfreshy': svar_is_fresh_in (svar_fresh (elements (free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2))) phi1
Hfreshy: svar_fresh (elements (free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2)) ≠ fresh_svar phi1
HeqHoc: false = bsvar_occur phi1 (S dbi)

free_svars phi1 ⊆ free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
solve_free_svars_inclusion 5.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: size (mu , phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
phi_subst: Pattern
Heqphi_subst: phi_subst = phi1^[svar:S dbi↦phi2]
B: SVarSet
HeqB: B = free_svars phi_subst ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: false = bsvar_occur phi1 (S dbi)

eval (update_svar_val Y E ρ) phi1^{svar:0↦Y} = eval (update_svar_val (fresh_svar phi1^{svar:S dbi↦X}) E (update_svar_val X (eval ρ phi2) ρ)) phi1^{svar:S dbi↦X}^{svar:0↦fresh_svar phi1^{svar:S dbi↦X}}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
phi_subst: Pattern
Heqphi_subst: phi_subst = phi1^[svar:S dbi↦phi2]
B: SVarSet
HeqB: B = free_svars phi_subst ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: false = bsvar_occur phi1 (S dbi)

eval (update_svar_val Y E ρ) phi1^{svar:0↦Y} = eval (update_svar_val (fresh_svar phi1^{svar:S dbi↦X}) E (update_svar_val X (eval ρ phi2) ρ)) phi1^{svar:S dbi↦X}^{svar:0↦fresh_svar phi1^{svar:S dbi↦X}}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
B: SVarSet
HeqB: B = free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: false = bsvar_occur phi1 (S dbi)

eval (update_svar_val Y E ρ) phi1^{svar:0↦Y} = eval (update_svar_val (fresh_svar phi1^{svar:S dbi↦X}) E (update_svar_val X (eval ρ phi2) ρ)) phi1^{svar:S dbi↦X}^{svar:0↦fresh_svar phi1^{svar:S dbi↦X}}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
B: SVarSet
HeqB: B = free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: false = bsvar_occur phi1 (S dbi)

eval (update_svar_val Y E ρ) phi1^{svar:0↦Y} = eval (update_svar_val (fresh_svar phi1) E (update_svar_val X (eval ρ phi2) ρ)) phi1^{svar:0↦fresh_svar phi1}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
B: SVarSet
HeqB: B = free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: false = bsvar_occur phi1 (S dbi)
well_formed_closed_mu_aux phi1 (S dbi)
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
B: SVarSet
HeqB: B = free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: false = bsvar_occur phi1 (S dbi)

well_formed_closed_mu_aux phi1 (S dbi)
apply wfc_mu_lower; auto.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
B: SVarSet
HeqB: B = free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: false = bsvar_occur phi1 (S dbi)

eval (update_svar_val Y E ρ) phi1^{svar:0↦Y} = eval (update_svar_val (fresh_svar phi1) E (update_svar_val X (eval ρ phi2) ρ)) phi1^{svar:0↦fresh_svar phi1}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
B: SVarSet
HeqB: B = free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: false = bsvar_occur phi1 (S dbi)
e: X = fresh_svar phi1

eval (update_svar_val Y E ρ) phi1^{svar:0↦Y} = eval (update_svar_val (fresh_svar phi1) E (update_svar_val X (eval ρ phi2) ρ)) phi1^{svar:0↦fresh_svar phi1}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
B: SVarSet
HeqB: B = free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: false = bsvar_occur phi1 (S dbi)
n: X ≠ fresh_svar phi1
eval (update_svar_val Y E ρ) phi1^{svar:0↦Y} = eval (update_svar_val (fresh_svar phi1) E (update_svar_val X (eval ρ phi2) ρ)) phi1^{svar:0↦fresh_svar phi1}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
B: SVarSet
HeqB: B = free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: false = bsvar_occur phi1 (S dbi)
e: X = fresh_svar phi1

eval (update_svar_val Y E ρ) phi1^{svar:0↦Y} = eval (update_svar_val (fresh_svar phi1) E (update_svar_val X (eval ρ phi2) ρ)) phi1^{svar:0↦fresh_svar phi1}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: fresh_svar phi1 ∉ free_svars (mu , phi1)
E: propset M
B: SVarSet
HeqB: B = free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦fresh_svar phi1} ∪ {[fresh_svar phi1]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy''': Y ≠ fresh_svar phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦fresh_svar phi1}
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: false = bsvar_occur phi1 (S dbi)

eval (update_svar_val Y E ρ) phi1^{svar:0↦Y} = eval (update_svar_val (fresh_svar phi1) E (update_svar_val (fresh_svar phi1) (eval ρ phi2) ρ)) phi1^{svar:0↦fresh_svar phi1}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: fresh_svar phi1 ∉ free_svars (mu , phi1)
E: propset M
B: SVarSet
HeqB: B = free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦fresh_svar phi1} ∪ {[fresh_svar phi1]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy''': Y ≠ fresh_svar phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦fresh_svar phi1}
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: false = bsvar_occur phi1 (S dbi)

eval (update_svar_val Y E ρ) phi1^{svar:0↦Y} = eval (update_svar_val (fresh_svar phi1) E ρ) phi1^{svar:0↦fresh_svar phi1}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: fresh_svar phi1 ∉ free_svars (mu , phi1)
E: propset M
B: SVarSet
HeqB: B = free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦fresh_svar phi1} ∪ {[fresh_svar phi1]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy''': Y ≠ fresh_svar phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦fresh_svar phi1}
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: false = bsvar_occur phi1 (S dbi)

svar_is_fresh_in Y phi1
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: fresh_svar phi1 ∉ free_svars (mu , phi1)
E: propset M
B: SVarSet
HeqB: B = free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦fresh_svar phi1} ∪ {[fresh_svar phi1]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy''': Y ≠ fresh_svar phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦fresh_svar phi1}
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: false = bsvar_occur phi1 (S dbi)
svar_is_fresh_in (fresh_svar phi1) phi1
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: fresh_svar phi1 ∉ free_svars (mu , phi1)
E: propset M
B: SVarSet
HeqB: B = free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦fresh_svar phi1} ∪ {[fresh_svar phi1]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy''': Y ≠ fresh_svar phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦fresh_svar phi1}
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: false = bsvar_occur phi1 (S dbi)

svar_is_fresh_in Y phi1
apply Hfreshy'.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: fresh_svar phi1 ∉ free_svars (mu , phi1)
E: propset M
B: SVarSet
HeqB: B = free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦fresh_svar phi1} ∪ {[fresh_svar phi1]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy''': Y ≠ fresh_svar phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦fresh_svar phi1}
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: false = bsvar_occur phi1 (S dbi)

svar_is_fresh_in (fresh_svar phi1) phi1
apply set_svar_fresh_is_fresh.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
B: SVarSet
HeqB: B = free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: false = bsvar_occur phi1 (S dbi)
n: X ≠ fresh_svar phi1

eval (update_svar_val Y E ρ) phi1^{svar:0↦Y} = eval (update_svar_val (fresh_svar phi1) E (update_svar_val X (eval ρ phi2) ρ)) phi1^{svar:0↦fresh_svar phi1}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
B: SVarSet
HeqB: B = free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: false = bsvar_occur phi1 (S dbi)
n: X ≠ fresh_svar phi1

fresh_svar phi1 ≠ X
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
B: SVarSet
HeqB: B = free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: false = bsvar_occur phi1 (S dbi)
n: X ≠ fresh_svar phi1
eval (update_svar_val Y E ρ) phi1^{svar:0↦Y} = eval (update_svar_val X (eval ρ phi2) (update_svar_val (fresh_svar phi1) E ρ)) phi1^{svar:0↦fresh_svar phi1}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
B: SVarSet
HeqB: B = free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: false = bsvar_occur phi1 (S dbi)
n: X ≠ fresh_svar phi1

fresh_svar phi1 ≠ X
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
B: SVarSet
HeqB: B = free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: false = bsvar_occur phi1 (S dbi)
n: X ≠ fresh_svar phi1

X ≠ fresh_svar phi1
apply n.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
B: SVarSet
HeqB: B = free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: false = bsvar_occur phi1 (S dbi)
n: X ≠ fresh_svar phi1

eval (update_svar_val Y E ρ) phi1^{svar:0↦Y} = eval (update_svar_val X (eval ρ phi2) (update_svar_val (fresh_svar phi1) E ρ)) phi1^{svar:0↦fresh_svar phi1}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
B: SVarSet
HeqB: B = free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: false = bsvar_occur phi1 (S dbi)
n: X ≠ fresh_svar phi1

eval (update_svar_val Y E ρ) phi1^{svar:0↦Y} = eval (update_svar_val (fresh_svar phi1) E ρ) phi1^{svar:0↦fresh_svar phi1}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
B: SVarSet
HeqB: B = free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: false = bsvar_occur phi1 (S dbi)
n: X ≠ fresh_svar phi1
svar_is_fresh_in X phi1^{svar:0↦fresh_svar phi1}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
B: SVarSet
HeqB: B = free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: false = bsvar_occur phi1 (S dbi)
n: X ≠ fresh_svar phi1

svar_is_fresh_in X phi1^{svar:0↦fresh_svar phi1}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
B: SVarSet
HeqB: B = free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: false = bsvar_occur phi1 (S dbi)
n: X ≠ fresh_svar phi1

X ≠ fresh_svar phi1
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
B: SVarSet
HeqB: B = free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: false = bsvar_occur phi1 (S dbi)
n: X ≠ fresh_svar phi1
svar_is_fresh_in X phi1
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
B: SVarSet
HeqB: B = free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: false = bsvar_occur phi1 (S dbi)
n: X ≠ fresh_svar phi1

svar_is_fresh_in X phi1
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars phi1
E: propset M
B: SVarSet
HeqB: B = free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: false = bsvar_occur phi1 (S dbi)
n: X ≠ fresh_svar phi1

svar_is_fresh_in X phi1
apply H.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
B: SVarSet
HeqB: B = free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: false = bsvar_occur phi1 (S dbi)
n: X ≠ fresh_svar phi1

eval (update_svar_val Y E ρ) phi1^{svar:0↦Y} = eval (update_svar_val (fresh_svar phi1) E ρ) phi1^{svar:0↦fresh_svar phi1}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
B: SVarSet
HeqB: B = free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: false = bsvar_occur phi1 (S dbi)
n: X ≠ fresh_svar phi1

svar_is_fresh_in Y phi1
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
B: SVarSet
HeqB: B = free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: false = bsvar_occur phi1 (S dbi)
n: X ≠ fresh_svar phi1
svar_is_fresh_in (fresh_svar phi1) phi1
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
B: SVarSet
HeqB: B = free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: false = bsvar_occur phi1 (S dbi)
n: X ≠ fresh_svar phi1

svar_is_fresh_in Y phi1
apply Hfreshy'.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi1 phi2 : Pattern), size phi1 ≤ sz → (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
dbi: db_index
phi1, phi2: Pattern
Hsz: S (size phi1) ≤ S sz
ρ: Valuation
X: svar
Hwfc2: well_formed_closed phi2
Hwfphi1: well_formed_closed_mu_aux (mu , phi1) (S dbi)
H: X ∉ free_svars (mu , phi1)
E: propset M
B: SVarSet
HeqB: B = free_svars phi1^[svar:S dbi↦phi2] ∪ {[fresh_svar phi1]} ∪ free_svars phi1 ∪ free_svars phi1^{svar:S dbi↦X} ∪ {[X]} ∪ free_svars phi2
Y: svar
HeqY: Y = svar_fresh (elements B)
Hfreshy: Y ≠ fresh_svar phi1
Hfreshy': svar_is_fresh_in Y phi1
Hfreshy'': svar_is_fresh_in Y phi1^{svar:S dbi↦X}
Hfreshy''': Y ≠ X
Hfreshy'''': svar_is_fresh_in Y phi2
Hfreshy5: svar_is_fresh_in Y phi1^[svar:S dbi↦phi2]
HeqHoc: false = bsvar_occur phi1 (S dbi)
n: X ≠ fresh_svar phi1

svar_is_fresh_in (fresh_svar phi1) phi1
apply set_svar_fresh_is_fresh. Qed.
signature: Signature
M: Model

(dbi : db_index) (phi1 phi2 : Pattern) (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
signature: Signature
M: Model

(dbi : db_index) (phi1 phi2 : Pattern) (ρ : Valuation) (X : svar), well_formed_closed phi2 → well_formed_closed_mu_aux phi1 (S dbi) → X ∉ free_svars phi1 → eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
signature: Signature
M: Model
dbi: db_index
phi1, phi2: Pattern
ρ: Valuation
X: svar
H: well_formed_closed phi2
H0: well_formed_closed_mu_aux phi1 (S dbi)
H1: X ∉ free_svars phi1

eval ρ phi1^[svar:dbi↦phi2] = eval (update_svar_val X (eval ρ phi2) ρ) phi1^{svar:dbi↦X}
signature: Signature
M: Model
dbi: db_index
phi1, phi2: Pattern
ρ: Valuation
X: svar
H: well_formed_closed phi2
H0: well_formed_closed_mu_aux phi1 (S dbi)
H1: X ∉ free_svars phi1

size phi1 ≤ size phi1
signature: Signature
M: Model
dbi: db_index
phi1, phi2: Pattern
ρ: Valuation
X: svar
H: well_formed_closed phi2
H0: well_formed_closed_mu_aux phi1 (S dbi)
H1: X ∉ free_svars phi1
well_formed_closed phi2
signature: Signature
M: Model
dbi: db_index
phi1, phi2: Pattern
ρ: Valuation
X: svar
H: well_formed_closed phi2
H0: well_formed_closed_mu_aux phi1 (S dbi)
H1: X ∉ free_svars phi1
well_formed_closed_mu_aux phi1 (S dbi)
signature: Signature
M: Model
dbi: db_index
phi1, phi2: Pattern
ρ: Valuation
X: svar
H: well_formed_closed phi2
H0: well_formed_closed_mu_aux phi1 (S dbi)
H1: X ∉ free_svars phi1
X ∉ free_svars phi1
signature: Signature
M: Model
dbi: db_index
phi1, phi2: Pattern
ρ: Valuation
X: svar
H: well_formed_closed phi2
H0: well_formed_closed_mu_aux phi1 (S dbi)
H1: X ∉ free_svars phi1

well_formed_closed phi2
signature: Signature
M: Model
dbi: db_index
phi1, phi2: Pattern
ρ: Valuation
X: svar
H: well_formed_closed phi2
H0: well_formed_closed_mu_aux phi1 (S dbi)
H1: X ∉ free_svars phi1
well_formed_closed_mu_aux phi1 (S dbi)
signature: Signature
M: Model
dbi: db_index
phi1, phi2: Pattern
ρ: Valuation
X: svar
H: well_formed_closed phi2
H0: well_formed_closed_mu_aux phi1 (S dbi)
H1: X ∉ free_svars phi1
X ∉ free_svars phi1
all: auto. Qed.
signature: Signature
M: Model

(sz : nat) (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
signature: Signature
M: Model

(sz : nat) (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
signature: Signature
M: Model
dbi: db_index
phi: Pattern
y: evar
Hsz: size phi ≤ 0
ρ: Valuation
x: evar
H: evar_is_fresh_in x phi
Hwf: well_formed_closed_ex_aux phi (S dbi)

eval ρ phi^[evar:dbi↦patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size phi ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x phi
Hwf: well_formed_closed_ex_aux phi (S dbi)
eval ρ phi^[evar:dbi↦patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
signature: Signature
M: Model
dbi: db_index
phi: Pattern
y: evar
Hsz: size phi ≤ 0
ρ: Valuation
x: evar
H: evar_is_fresh_in x phi
Hwf: well_formed_closed_ex_aux phi (S dbi)

eval ρ phi^[evar:dbi↦patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
signature: Signature
M: Model
dbi: db_index
x0, y: evar
Hsz: 00
ρ: Valuation
x: evar
H: evar_is_fresh_in x (patt_free_evar x0)
Hwf: well_formed_closed_ex_aux (patt_free_evar x0) (S dbi)

eval ρ (patt_free_evar x0) = eval (update_evar_val x (evar_valuation ρ y) ρ) (patt_free_evar x0)^{evar:dbi↦x}
signature: Signature
M: Model
dbi: db_index
x0: svar
y: evar
Hsz: 00
ρ: Valuation
x: evar
H: evar_is_fresh_in x (patt_free_svar x0)
Hwf: well_formed_closed_ex_aux (patt_free_svar x0) (S dbi)
eval ρ (patt_free_svar x0) = eval (update_evar_val x (evar_valuation ρ y) ρ) (patt_free_svar x0)^{evar:dbi↦x}
signature: Signature
M: Model
dbi, n: db_index
y: evar
Hsz: 00
ρ: Valuation
x: evar
H: evar_is_fresh_in x (patt_bound_evar n)
Hwf: well_formed_closed_ex_aux (patt_bound_evar n) (S dbi)
eval ρ match compare_nat n dbi with | Nat_less _ _ _ => patt_bound_evar n | Nat_equal _ _ _ => patt_free_evar y | Nat_greater _ _ _ => patt_bound_evar (Nat.pred n) end = eval (update_evar_val x (evar_valuation ρ y) ρ) (patt_bound_evar n)^{evar:dbi↦x}
signature: Signature
M: Model
dbi, n: db_index
y: evar
Hsz: 00
ρ: Valuation
x: evar
H: evar_is_fresh_in x (patt_bound_svar n)
Hwf: well_formed_closed_ex_aux (patt_bound_svar n) (S dbi)
eval ρ (patt_bound_svar n) = eval (update_evar_val x (evar_valuation ρ y) ρ) (patt_bound_svar n)^{evar:dbi↦x}
signature: Signature
M: Model
dbi: db_index
sigma: symbols
y: evar
Hsz: 00
ρ: Valuation
x: evar
H: evar_is_fresh_in x (patt_sym sigma)
Hwf: well_formed_closed_ex_aux (patt_sym sigma) (S dbi)
eval ρ (patt_sym sigma) = eval (update_evar_val x (evar_valuation ρ y) ρ) (patt_sym sigma)^{evar:dbi↦x}
signature: Signature
M: Model
dbi: db_index
phi1, phi2: Pattern
y: evar
Hsz: S (size phi1 + size phi2) ≤ 0
ρ: Valuation
x: evar
H: evar_is_fresh_in x (phi1 $ phi2)
Hwf: well_formed_closed_ex_aux (phi1 $ phi2) (S dbi)
eval ρ (phi1^[evar:dbi↦patt_free_evar y] $ phi2^[evar:dbi↦patt_free_evar y]) = eval (update_evar_val x (evar_valuation ρ y) ρ) (phi1 $ phi2)^{evar:dbi↦x}
signature: Signature
M: Model
dbi: db_index
y: evar
Hsz: 00
ρ: Valuation
x: evar
H: evar_is_fresh_in x ⊥
Hwf: well_formed_closed_ex_aux ⊥ (S dbi)
eval ρ ⊥ = eval (update_evar_val x (evar_valuation ρ y) ρ) ⊥^{evar:dbi↦x}
signature: Signature
M: Model
dbi: db_index
phi1, phi2: Pattern
y: evar
Hsz: S (size phi1 + size phi2) ≤ 0
ρ: Valuation
x: evar
H: evar_is_fresh_in x (phi1 ---> phi2)
Hwf: well_formed_closed_ex_aux (phi1 ---> phi2) (S dbi)
eval ρ (phi1^[evar:dbi↦patt_free_evar y] ---> phi2^[evar:dbi↦patt_free_evar y]) = eval (update_evar_val x (evar_valuation ρ y) ρ) (phi1 ---> phi2)^{evar:dbi↦x}
signature: Signature
M: Model
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ 0
ρ: Valuation
x: evar
H: evar_is_fresh_in x (ex , phi)
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
eval ρ (ex , phi^[evar:S dbi↦patt_free_evar y]) = eval (update_evar_val x (evar_valuation ρ y) ρ) (ex , phi)^{evar:dbi↦x}
signature: Signature
M: Model
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ 0
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
eval ρ (mu , phi^[evar:dbi↦patt_free_evar y]) = eval (update_evar_val x (evar_valuation ρ y) ρ) (mu , phi)^{evar:dbi↦x}
signature: Signature
M: Model
dbi: db_index
x0, y: evar
Hsz: 00
ρ: Valuation
x: evar
H: evar_is_fresh_in x (patt_free_evar x0)
Hwf: well_formed_closed_ex_aux (patt_free_evar x0) (S dbi)

eval ρ (patt_free_evar x0) = eval (update_evar_val x (evar_valuation ρ y) ρ) (patt_free_evar x0)^{evar:dbi↦x}
signature: Signature
M: Model
dbi: db_index
x0, y: evar
Hsz: 00
ρ: Valuation
x: evar
H: x ∉ free_evars (patt_free_evar x0)
Hwf: well_formed_closed_ex_aux (patt_free_evar x0) (S dbi)

eval ρ (patt_free_evar x0) = eval (update_evar_val x (evar_valuation ρ y) ρ) (patt_free_evar x0)^{evar:dbi↦x}
signature: Signature
M: Model
dbi: db_index
x0, y: evar
Hsz: 00
ρ: Valuation
x: evar
H: x ∉ free_evars (patt_free_evar x0)
Hwf: well_formed_closed_ex_aux (patt_free_evar x0) (S dbi)

eval ρ (patt_free_evar x0) = eval (update_evar_val x (evar_valuation ρ y) ρ) (patt_free_evar x0)
signature: Signature
M: Model
dbi: db_index
x0, y: evar
Hsz: 00
ρ: Valuation
x: evar
H: x ∉ free_evars (patt_free_evar x0)
Hwf: well_formed_closed_ex_aux (patt_free_evar x0) (S dbi)

{[evar_valuation ρ x0]} = {[evar_valuation (update_evar_val x (evar_valuation ρ y) ρ) x0]}
signature: Signature
M: Model
dbi: db_index
x0, y: evar
Hsz: 00
ρ: Valuation
x: evar
H: x ∉ free_evars (patt_free_evar x0)
Hwf: well_formed_closed_ex_aux (patt_free_evar x0) (S dbi)

{[evar_valuation ρ x0]} = {[evar_valuation {| evar_valuation := λ ev' : evar, if decide (x = ev') then evar_valuation ρ y else evar_valuation ρ ev'; svar_valuation := svar_valuation ρ |} x0]}
signature: Signature
M: Model
dbi: db_index
x0, y: evar
Hsz: 00
ρₑ: evar → M
ρₛ: svar → propset M
x: evar
H: x ∉ free_evars (patt_free_evar x0)
Hwf: well_formed_closed_ex_aux (patt_free_evar x0) (S dbi)

{[evar_valuation {| evar_valuation := ρₑ; svar_valuation := ρₛ |} x0]} = {[evar_valuation {| evar_valuation := λ ev' : evar, if decide (x = ev') then evar_valuation {| evar_valuation := ρₑ; svar_valuation := ρₛ |} y else evar_valuation {| evar_valuation := ρₑ; svar_valuation := ρₛ |} ev'; svar_valuation := svar_valuation {| evar_valuation := ρₑ; svar_valuation := ρₛ |} |} x0]}
signature: Signature
M: Model
dbi: db_index
x0, y: evar
Hsz: 00
ρₑ: evar → M
ρₛ: svar → propset M
x: evar
H: x ∉ free_evars (patt_free_evar x0)
Hwf: well_formed_closed_ex_aux (patt_free_evar x0) (S dbi)

{[ρₑ x0]} = {[if decide (x = x0) then ρₑ y else ρₑ x0]}
signature: Signature
M: Model
dbi: db_index
x0, y: evar
Hsz: 00
ρₑ: evar → M
ρₛ: svar → propset M
x: evar
H: x ∉ free_evars (patt_free_evar x0)
Hwf: well_formed_closed_ex_aux (patt_free_evar x0) (S dbi)
e: x = x0

{[ρₑ x0]} = {[ρₑ y]}
signature: Signature
M: Model
dbi: db_index
x0, y: evar
Hsz: 00
ρₑ: evar → M
ρₛ: svar → propset M
x: evar
H: x ∉ free_evars (patt_free_evar x0)
Hwf: well_formed_closed_ex_aux (patt_free_evar x0) (S dbi)
n: x ≠ x0
{[ρₑ x0]} = {[ρₑ x0]}
signature: Signature
M: Model
dbi: db_index
x0, y: evar
Hsz: 00
ρₑ: evar → M
ρₛ: svar → propset M
x: evar
H: x ∉ free_evars (patt_free_evar x0)
Hwf: well_formed_closed_ex_aux (patt_free_evar x0) (S dbi)
e: x = x0

{[ρₑ x0]} = {[ρₑ y]}
signature: Signature
M: Model
dbi: db_index
x0, y: evar
Hsz: 00
ρₑ: evar → M
ρₛ: svar → propset M
x: evar
H: x ∉ free_evars (patt_free_evar x0)
Hwf: well_formed_closed_ex_aux (patt_free_evar x0) (S dbi)
e: x = x0

{[ρₑ x0]} = {[ρₑ y]}
signature: Signature
M: Model
dbi: db_index
x0, y: evar
Hsz: 00
ρₑ: evar → M
ρₛ: svar → propset M
x: evar
H: x ∈ free_evars (patt_free_evar x0) → False
Hwf: well_formed_closed_ex_aux (patt_free_evar x0) (S dbi)
e: x = x0

{[ρₑ x0]} = {[ρₑ y]}
signature: Signature
M: Model
dbi: db_index
x0, y: evar
Hsz: 00
ρₑ: evar → M
ρₛ: svar → propset M
x: evar
H: x ∈ free_evars (patt_free_evar x0) → False
Hwf: well_formed_closed_ex_aux (patt_free_evar x0) (S dbi)
e: x = x0

False
signature: Signature
M: Model
dbi: db_index
x0, y: evar
Hsz: 00
ρₑ: evar → M
ρₛ: svar → propset M
x: evar
H: x ∈ free_evars (patt_free_evar x0) → False
Hwf: well_formed_closed_ex_aux (patt_free_evar x0) (S dbi)
e: x = x0

x ∈ free_evars (patt_free_evar x0)
signature: Signature
M: Model
dbi: db_index
x0, y: evar
Hsz: 00
ρₑ: evar → M
ρₛ: svar → propset M
x: evar
H: x ∈ free_evars (patt_free_evar x0) → False
Hwf: well_formed_closed_ex_aux (patt_free_evar x0) (S dbi)
e: x = x0

x = x0
auto.
signature: Signature
M: Model
dbi: db_index
x0, y: evar
Hsz: 00
ρₑ: evar → M
ρₛ: svar → propset M
x: evar
H: x ∉ free_evars (patt_free_evar x0)
Hwf: well_formed_closed_ex_aux (patt_free_evar x0) (S dbi)
n: x ≠ x0

{[ρₑ x0]} = {[ρₑ x0]}
auto.
signature: Signature
M: Model
dbi: db_index
x0: svar
y: evar
Hsz: 00
ρ: Valuation
x: evar
H: evar_is_fresh_in x (patt_free_svar x0)
Hwf: well_formed_closed_ex_aux (patt_free_svar x0) (S dbi)

eval ρ (patt_free_svar x0) = eval (update_evar_val x (evar_valuation ρ y) ρ) (patt_free_svar x0)^{evar:dbi↦x}
signature: Signature
M: Model
dbi: db_index
x0: svar
y: evar
Hsz: 00
ρ: Valuation
x: evar
H: evar_is_fresh_in x (patt_free_svar x0)
Hwf: well_formed_closed_ex_aux (patt_free_svar x0) (S dbi)

eval ρ (patt_free_svar x0) = eval (update_evar_val x (evar_valuation ρ y) ρ) (patt_free_svar x0)
auto.
signature: Signature
M: Model
dbi, n: db_index
y: evar
Hsz: 00
ρ: Valuation
x: evar
H: evar_is_fresh_in x (patt_bound_evar n)
Hwf: well_formed_closed_ex_aux (patt_bound_evar n) (S dbi)

eval ρ match compare_nat n dbi with | Nat_less _ _ _ => patt_bound_evar n | Nat_equal _ _ _ => patt_free_evar y | Nat_greater _ _ _ => patt_bound_evar (Nat.pred n) end = eval (update_evar_val x (evar_valuation ρ y) ρ) (patt_bound_evar n)^{evar:dbi↦x}
signature: Signature
M: Model
dbi, n: db_index
y: evar
Hsz: 00
ρ: Valuation
x: evar
H: evar_is_fresh_in x (patt_bound_evar n)
Hwf: well_formed_closed_ex_aux (patt_bound_evar n) (S dbi)

eval ρ match compare_nat n dbi with | Nat_less _ _ _ => patt_bound_evar n | Nat_equal _ _ _ => patt_free_evar y | Nat_greater _ _ _ => patt_bound_evar (Nat.pred n) end = eval (update_evar_val x (evar_valuation ρ y) ρ) match compare_nat n dbi with | Nat_less _ _ _ => patt_bound_evar n | Nat_equal _ _ _ => patt_free_evar x | Nat_greater _ _ _ => patt_bound_evar (Nat.pred n) end
signature: Signature
M: Model
dbi, n: db_index
y: evar
Hsz: 00
ρ: Valuation
x: evar
H: evar_is_fresh_in x (patt_bound_evar n)
Hwf: well_formed_closed_ex_aux (patt_bound_evar n) (S dbi)
l: n < dbi
H0: compare_nat n dbi = Nat_less n dbi l

eval ρ (patt_bound_evar n) = eval (update_evar_val x (evar_valuation ρ y) ρ) (patt_bound_evar n)
signature: Signature
M: Model
dbi: db_index
y: evar
Hsz: 00
ρ: Valuation
x: evar
Hwf: well_formed_closed_ex_aux (patt_bound_evar dbi) (S dbi)
H: evar_is_fresh_in x (patt_bound_evar dbi)
H0: compare_nat dbi dbi = Nat_equal dbi dbi erefl
eval ρ (patt_free_evar y) = eval (update_evar_val x (evar_valuation ρ y) ρ) (patt_free_evar x)
signature: Signature
M: Model
dbi, n: db_index
y: evar
Hsz: 00
ρ: Valuation
x: evar
H: evar_is_fresh_in x (patt_bound_evar n)
Hwf: well_formed_closed_ex_aux (patt_bound_evar n) (S dbi)
g: n > dbi
H0: compare_nat n dbi = Nat_greater n dbi g
eval ρ (patt_bound_evar (Nat.pred n)) = eval (update_evar_val x (evar_valuation ρ y) ρ) (patt_bound_evar (Nat.pred n))
signature: Signature
M: Model
dbi, n: db_index
y: evar
Hsz: 00
ρ: Valuation
x: evar
H: evar_is_fresh_in x (patt_bound_evar n)
Hwf: well_formed_closed_ex_aux (patt_bound_evar n) (S dbi)
l: n < dbi
H0: compare_nat n dbi = Nat_less n dbi l

eval ρ (patt_bound_evar n) = eval (update_evar_val x (evar_valuation ρ y) ρ) (patt_bound_evar n)
auto.
signature: Signature
M: Model
dbi: db_index
y: evar
Hsz: 00
ρ: Valuation
x: evar
Hwf: well_formed_closed_ex_aux (patt_bound_evar dbi) (S dbi)
H: evar_is_fresh_in x (patt_bound_evar dbi)
H0: compare_nat dbi dbi = Nat_equal dbi dbi erefl

eval ρ (patt_free_evar y) = eval (update_evar_val x (evar_valuation ρ y) ρ) (patt_free_evar x)
signature: Signature
M: Model
dbi: db_index
y: evar
Hsz: 00
ρ: Valuation
x: evar
Hwf: well_formed_closed_ex_aux (patt_bound_evar dbi) (S dbi)
H: evar_is_fresh_in x (patt_bound_evar dbi)
H0: compare_nat dbi dbi = Nat_equal dbi dbi erefl

{[evar_valuation ρ y]} = {[evar_valuation (update_evar_val x (evar_valuation ρ y) ρ) x]}
signature: Signature
M: Model
dbi: db_index
y: evar
Hsz: 00
ρₑ: evar → M
ρₛ: svar → propset M
x: evar
Hwf: well_formed_closed_ex_aux (patt_bound_evar dbi) (S dbi)
H: evar_is_fresh_in x (patt_bound_evar dbi)
H0: compare_nat dbi dbi = Nat_equal dbi dbi erefl

{[evar_valuation {| evar_valuation := ρₑ; svar_valuation := ρₛ |} y]} = {[evar_valuation (update_evar_val x (evar_valuation {| evar_valuation := ρₑ; svar_valuation := ρₛ |} y) {| evar_valuation := ρₑ; svar_valuation := ρₛ |}) x]}
signature: Signature
M: Model
dbi: db_index
y: evar
Hsz: 00
ρₑ: evar → M
ρₛ: svar → propset M
x: evar
Hwf: well_formed_closed_ex_aux (patt_bound_evar dbi) (S dbi)
H: evar_is_fresh_in x (patt_bound_evar dbi)
H0: compare_nat dbi dbi = Nat_equal dbi dbi erefl

{[ρₑ y]} = {[if decide (x = x) then ρₑ y else ρₑ x]}
signature: Signature
M: Model
dbi: db_index
y: evar
Hsz: 00
ρₑ: evar → M
ρₛ: svar → propset M
x: evar
Hwf: well_formed_closed_ex_aux (patt_bound_evar dbi) (S dbi)
H: evar_is_fresh_in x (patt_bound_evar dbi)
H0: compare_nat dbi dbi = Nat_equal dbi dbi erefl

{[ρₑ y]} = {[if decide (x = x) then ρₑ y else ρₑ x]}
signature: Signature
M: Model
dbi: db_index
y: evar
Hsz: 00
ρₑ: evar → M
ρₛ: svar → propset M
x: evar
Hwf: well_formed_closed_ex_aux (patt_bound_evar dbi) (S dbi)
H: evar_is_fresh_in x (patt_bound_evar dbi)
H0: compare_nat dbi dbi = Nat_equal dbi dbi erefl
n: x ≠ x
H1: decide (x = x) = right n

{[ρₑ y]} = {[ρₑ x]}
contradiction.
signature: Signature
M: Model
dbi, n: db_index
y: evar
Hsz: 00
ρ: Valuation
x: evar
H: evar_is_fresh_in x (patt_bound_evar n)
Hwf: well_formed_closed_ex_aux (patt_bound_evar n) (S dbi)
g: n > dbi
H0: compare_nat n dbi = Nat_greater n dbi g

eval ρ (patt_bound_evar (Nat.pred n)) = eval (update_evar_val x (evar_valuation ρ y) ρ) (patt_bound_evar (Nat.pred n))
auto.
signature: Signature
M: Model
dbi, n: db_index
y: evar
Hsz: 00
ρ: Valuation
x: evar
H: evar_is_fresh_in x (patt_bound_svar n)
Hwf: well_formed_closed_ex_aux (patt_bound_svar n) (S dbi)

eval ρ (patt_bound_svar n) = eval (update_evar_val x (evar_valuation ρ y) ρ) (patt_bound_svar n)^{evar:dbi↦x}
rewrite 2!eval_bound_svar_simpl; auto.
signature: Signature
M: Model
dbi: db_index
sigma: symbols
y: evar
Hsz: 00
ρ: Valuation
x: evar
H: evar_is_fresh_in x (patt_sym sigma)
Hwf: well_formed_closed_ex_aux (patt_sym sigma) (S dbi)

eval ρ (patt_sym sigma) = eval (update_evar_val x (evar_valuation ρ y) ρ) (patt_sym sigma)^{evar:dbi↦x}
signature: Signature
M: Model
dbi: db_index
sigma: symbols
y: evar
Hsz: 00
ρ: Valuation
x: evar
H: evar_is_fresh_in x (patt_sym sigma)
Hwf: well_formed_closed_ex_aux (patt_sym sigma) (S dbi)

eval ρ (patt_sym sigma) = eval (update_evar_val x (evar_valuation ρ y) ρ) (patt_sym sigma)^{evar:dbi↦x}
repeat rewrite -> eval_sym_simpl; auto.
signature: Signature
M: Model
dbi: db_index
phi1, phi2: Pattern
y: evar
Hsz: S (size phi1 + size phi2) ≤ 0
ρ: Valuation
x: evar
H: evar_is_fresh_in x (phi1 $ phi2)
Hwf: well_formed_closed_ex_aux (phi1 $ phi2) (S dbi)

eval ρ (phi1^[evar:dbi↦patt_free_evar y] $ phi2^[evar:dbi↦patt_free_evar y]) = eval (update_evar_val x (evar_valuation ρ y) ρ) (phi1 $ phi2)^{evar:dbi↦x}
lia.
signature: Signature
M: Model
dbi: db_index
y: evar
Hsz: 00
ρ: Valuation
x: evar
H: evar_is_fresh_in x ⊥
Hwf: well_formed_closed_ex_aux ⊥ (S dbi)

eval ρ ⊥ = eval (update_evar_val x (evar_valuation ρ y) ρ) ⊥^{evar:dbi↦x}
signature: Signature
M: Model
dbi: db_index
y: evar
Hsz: 00
ρ: Valuation
x: evar
H: evar_is_fresh_in x ⊥
Hwf: well_formed_closed_ex_aux ⊥ (S dbi)

eval ρ ⊥ = eval (update_evar_val x (evar_valuation ρ y) ρ) ⊥^{evar:dbi↦x}
repeat rewrite eval_bott_simpl; auto.
signature: Signature
M: Model
dbi: db_index
phi1, phi2: Pattern
y: evar
Hsz: S (size phi1 + size phi2) ≤ 0
ρ: Valuation
x: evar
H: evar_is_fresh_in x (phi1 ---> phi2)
Hwf: well_formed_closed_ex_aux (phi1 ---> phi2) (S dbi)

eval ρ (phi1^[evar:dbi↦patt_free_evar y] ---> phi2^[evar:dbi↦patt_free_evar y]) = eval (update_evar_val x (evar_valuation ρ y) ρ) (phi1 ---> phi2)^{evar:dbi↦x}
lia.
signature: Signature
M: Model
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ 0
ρ: Valuation
x: evar
H: evar_is_fresh_in x (ex , phi)
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)

eval ρ (ex , phi^[evar:S dbi↦patt_free_evar y]) = eval (update_evar_val x (evar_valuation ρ y) ρ) (ex , phi)^{evar:dbi↦x}
lia.
signature: Signature
M: Model
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ 0
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)

eval ρ (mu , phi^[evar:dbi↦patt_free_evar y]) = eval (update_evar_val x (evar_valuation ρ y) ρ) (mu , phi)^{evar:dbi↦x}
lia.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size phi ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x phi
Hwf: well_formed_closed_ex_aux phi (S dbi)

eval ρ phi^[evar:dbi↦patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
x0, y: evar
Hsz: size (patt_free_evar x0) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (patt_free_evar x0)
Hwf: well_formed_closed_ex_aux (patt_free_evar x0) (S dbi)

eval ρ (patt_free_evar x0) = eval (update_evar_val x (evar_valuation ρ y) ρ) (patt_free_evar x0)^{evar:dbi↦x}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
x0: svar
y: evar
Hsz: size (patt_free_svar x0) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (patt_free_svar x0)
Hwf: well_formed_closed_ex_aux (patt_free_svar x0) (S dbi)
eval ρ (patt_free_svar x0) = eval (update_evar_val x (evar_valuation ρ y) ρ) (patt_free_svar x0)^{evar:dbi↦x}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi, n: db_index
y: evar
Hsz: size (patt_bound_evar n) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (patt_bound_evar n)
Hwf: well_formed_closed_ex_aux (patt_bound_evar n) (S dbi)
eval ρ match compare_nat n dbi with | Nat_less _ _ _ => patt_bound_evar n | Nat_equal _ _ _ => patt_free_evar y | Nat_greater _ _ _ => patt_bound_evar (Nat.pred n) end = eval (update_evar_val x (evar_valuation ρ y) ρ) (patt_bound_evar n)^{evar:dbi↦x}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi, n: db_index
y: evar
Hsz: size (patt_bound_svar n) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (patt_bound_svar n)
Hwf: well_formed_closed_ex_aux (patt_bound_svar n) (S dbi)
eval ρ (patt_bound_svar n) = eval (update_evar_val x (evar_valuation ρ y) ρ) (patt_bound_svar n)^{evar:dbi↦x}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
sigma: symbols
y: evar
Hsz: size (patt_sym sigma) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (patt_sym sigma)
Hwf: well_formed_closed_ex_aux (patt_sym sigma) (S dbi)
eval ρ (patt_sym sigma) = eval (update_evar_val x (evar_valuation ρ y) ρ) (patt_sym sigma)^{evar:dbi↦x}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi1, phi2: Pattern
y: evar
Hsz: size (phi1 $ phi2) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (phi1 $ phi2)
Hwf: well_formed_closed_ex_aux (phi1 $ phi2) (S dbi)
eval ρ (phi1^[evar:dbi↦patt_free_evar y] $ phi2^[evar:dbi↦patt_free_evar y]) = eval (update_evar_val x (evar_valuation ρ y) ρ) (phi1 $ phi2)^{evar:dbi↦x}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
y: evar
Hsz: size ⊥ ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x ⊥
Hwf: well_formed_closed_ex_aux ⊥ (S dbi)
eval ρ ⊥ = eval (update_evar_val x (evar_valuation ρ y) ρ) ⊥^{evar:dbi↦x}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi1, phi2: Pattern
y: evar
Hsz: size (phi1 ---> phi2) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (phi1 ---> phi2)
Hwf: well_formed_closed_ex_aux (phi1 ---> phi2) (S dbi)
eval ρ (phi1^[evar:dbi↦patt_free_evar y] ---> phi2^[evar:dbi↦patt_free_evar y]) = eval (update_evar_val x (evar_valuation ρ y) ρ) (phi1 ---> phi2)^{evar:dbi↦x}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (ex , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (ex , phi)
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
eval ρ (ex , phi^[evar:S dbi↦patt_free_evar y]) = eval (update_evar_val x (evar_valuation ρ y) ρ) (ex , phi)^{evar:dbi↦x}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
eval ρ (mu , phi^[evar:dbi↦patt_free_evar y]) = eval (update_evar_val x (evar_valuation ρ y) ρ) (mu , phi)^{evar:dbi↦x}
(* HERE we duplicate some of the effort. I do not like it. *)
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
x0, y: evar
Hsz: size (patt_free_evar x0) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (patt_free_evar x0)
Hwf: well_formed_closed_ex_aux (patt_free_evar x0) (S dbi)

eval ρ (patt_free_evar x0) = eval (update_evar_val x (evar_valuation ρ y) ρ) (patt_free_evar x0)^{evar:dbi↦x}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
x0, y: evar
Hsz: size (patt_free_evar x0) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars (patt_free_evar x0)
Hwf: well_formed_closed_ex_aux (patt_free_evar x0) (S dbi)

eval ρ (patt_free_evar x0) = eval (update_evar_val x (evar_valuation ρ y) ρ) (patt_free_evar x0)^{evar:dbi↦x}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
x0, y: evar
Hsz: size (patt_free_evar x0) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars (patt_free_evar x0)
Hwf: well_formed_closed_ex_aux (patt_free_evar x0) (S dbi)

eval ρ (patt_free_evar x0) = eval (update_evar_val x (evar_valuation ρ y) ρ) (patt_free_evar x0)
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
x0, y: evar
Hsz: size (patt_free_evar x0) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars (patt_free_evar x0)
Hwf: well_formed_closed_ex_aux (patt_free_evar x0) (S dbi)

{[evar_valuation ρ x0]} = {[evar_valuation (update_evar_val x (evar_valuation ρ y) ρ) x0]}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
x0, y: evar
Hsz: size (patt_free_evar x0) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars (patt_free_evar x0)
Hwf: well_formed_closed_ex_aux (patt_free_evar x0) (S dbi)

{[evar_valuation ρ x0]} = {[evar_valuation {| evar_valuation := λ ev' : evar, if decide (x = ev') then evar_valuation ρ y else evar_valuation ρ ev'; svar_valuation := svar_valuation ρ |} x0]}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
x0, y: evar
Hsz: size (patt_free_evar x0) ≤ S sz
ρₑ: evar → M
ρₛ: svar → propset M
x: evar
H: x ∉ free_evars (patt_free_evar x0)
Hwf: well_formed_closed_ex_aux (patt_free_evar x0) (S dbi)

{[evar_valuation {| evar_valuation := ρₑ; svar_valuation := ρₛ |} x0]} = {[evar_valuation {| evar_valuation := λ ev' : evar, if decide (x = ev') then evar_valuation {| evar_valuation := ρₑ; svar_valuation := ρₛ |} y else evar_valuation {| evar_valuation := ρₑ; svar_valuation := ρₛ |} ev'; svar_valuation := svar_valuation {| evar_valuation := ρₑ; svar_valuation := ρₛ |} |} x0]}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
x0, y: evar
Hsz: size (patt_free_evar x0) ≤ S sz
ρₑ: evar → M
ρₛ: svar → propset M
x: evar
H: x ∉ free_evars (patt_free_evar x0)
Hwf: well_formed_closed_ex_aux (patt_free_evar x0) (S dbi)

{[ρₑ x0]} = {[if decide (x = x0) then ρₑ y else ρₑ x0]}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
x0, y: evar
Hsz: size (patt_free_evar x0) ≤ S sz
ρₑ: evar → M
ρₛ: svar → propset M
x: evar
H: x ∉ free_evars (patt_free_evar x0)
Hwf: well_formed_closed_ex_aux (patt_free_evar x0) (S dbi)
e: x = x0

{[ρₑ x0]} = {[ρₑ y]}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
x0, y: evar
Hsz: size (patt_free_evar x0) ≤ S sz
ρₑ: evar → M
ρₛ: svar → propset M
x: evar
H: x ∉ free_evars (patt_free_evar x0)
Hwf: well_formed_closed_ex_aux (patt_free_evar x0) (S dbi)
n: x ≠ x0
{[ρₑ x0]} = {[ρₑ x0]}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
x0, y: evar
Hsz: size (patt_free_evar x0) ≤ S sz
ρₑ: evar → M
ρₛ: svar → propset M
x: evar
H: x ∉ free_evars (patt_free_evar x0)
Hwf: well_formed_closed_ex_aux (patt_free_evar x0) (S dbi)
e: x = x0

{[ρₑ x0]} = {[ρₑ y]}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
x0, y: evar
Hsz: size (patt_free_evar x0) ≤ S sz
ρₑ: evar → M
ρₛ: svar → propset M
x: evar
H: x ∉ free_evars (patt_free_evar x0)
Hwf: well_formed_closed_ex_aux (patt_free_evar x0) (S dbi)
e: x = x0

{[ρₑ x0]} = {[ρₑ y]}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
x0, y: evar
Hsz: size (patt_free_evar x0) ≤ S sz
ρₑ: evar → M
ρₛ: svar → propset M
x: evar
H: x ∈ free_evars (patt_free_evar x0) → False
Hwf: well_formed_closed_ex_aux (patt_free_evar x0) (S dbi)
e: x = x0

{[ρₑ x0]} = {[ρₑ y]}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
x0, y: evar
Hsz: size (patt_free_evar x0) ≤ S sz
ρₑ: evar → M
ρₛ: svar → propset M
x: evar
H: x ∈ free_evars (patt_free_evar x0) → False
Hwf: well_formed_closed_ex_aux (patt_free_evar x0) (S dbi)
e: x = x0

False
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
x0, y: evar
Hsz: size (patt_free_evar x0) ≤ S sz
ρₑ: evar → M
ρₛ: svar → propset M
x: evar
H: x ∈ free_evars (patt_free_evar x0) → False
Hwf: well_formed_closed_ex_aux (patt_free_evar x0) (S dbi)
e: x = x0

x ∈ free_evars (patt_free_evar x0)
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
x0, y: evar
Hsz: size (patt_free_evar x0) ≤ S sz
ρₑ: evar → M
ρₛ: svar → propset M
x: evar
H: x ∈ free_evars (patt_free_evar x0) → False
Hwf: well_formed_closed_ex_aux (patt_free_evar x0) (S dbi)
e: x = x0

x = x0
auto.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
x0, y: evar
Hsz: size (patt_free_evar x0) ≤ S sz
ρₑ: evar → M
ρₛ: svar → propset M
x: evar
H: x ∉ free_evars (patt_free_evar x0)
Hwf: well_formed_closed_ex_aux (patt_free_evar x0) (S dbi)
n: x ≠ x0

{[ρₑ x0]} = {[ρₑ x0]}
auto.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
x0: svar
y: evar
Hsz: size (patt_free_svar x0) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (patt_free_svar x0)
Hwf: well_formed_closed_ex_aux (patt_free_svar x0) (S dbi)

eval ρ (patt_free_svar x0) = eval (update_evar_val x (evar_valuation ρ y) ρ) (patt_free_svar x0)^{evar:dbi↦x}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
x0: svar
y: evar
Hsz: size (patt_free_svar x0) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (patt_free_svar x0)
Hwf: well_formed_closed_ex_aux (patt_free_svar x0) (S dbi)

eval ρ (patt_free_svar x0) = eval (update_evar_val x (evar_valuation ρ y) ρ) (patt_free_svar x0)
auto.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi, n: db_index
y: evar
Hsz: size (patt_bound_evar n) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (patt_bound_evar n)
Hwf: well_formed_closed_ex_aux (patt_bound_evar n) (S dbi)

eval ρ match compare_nat n dbi with | Nat_less _ _ _ => patt_bound_evar n | Nat_equal _ _ _ => patt_free_evar y | Nat_greater _ _ _ => patt_bound_evar (Nat.pred n) end = eval (update_evar_val x (evar_valuation ρ y) ρ) (patt_bound_evar n)^{evar:dbi↦x}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi, n: db_index
y: evar
Hsz: size (patt_bound_evar n) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (patt_bound_evar n)
Hwf: well_formed_closed_ex_aux (patt_bound_evar n) (S dbi)

eval ρ match compare_nat n dbi with | Nat_less _ _ _ => patt_bound_evar n | Nat_equal _ _ _ => patt_free_evar y | Nat_greater _ _ _ => patt_bound_evar (Nat.pred n) end = eval (update_evar_val x (evar_valuation ρ y) ρ) match compare_nat n dbi with | Nat_less _ _ _ => patt_bound_evar n | Nat_equal _ _ _ => patt_free_evar x | Nat_greater _ _ _ => patt_bound_evar (Nat.pred n) end
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi, n: db_index
y: evar
Hsz: size (patt_bound_evar n) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (patt_bound_evar n)
Hwf: well_formed_closed_ex_aux (patt_bound_evar n) (S dbi)
l: n < dbi
H0: compare_nat n dbi = Nat_less n dbi l

eval ρ (patt_bound_evar n) = eval (update_evar_val x (evar_valuation ρ y) ρ) (patt_bound_evar n)
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi, n: db_index
y: evar
Hsz: size (patt_bound_evar n) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (patt_bound_evar n)
Hwf: well_formed_closed_ex_aux (patt_bound_evar n) (S dbi)
e: n = dbi
H0: compare_nat n dbi = Nat_equal n dbi e
eval ρ (patt_free_evar y) = eval (update_evar_val x (evar_valuation ρ y) ρ) (patt_free_evar x)
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi, n: db_index
y: evar
Hsz: size (patt_bound_evar n) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (patt_bound_evar n)
Hwf: well_formed_closed_ex_aux (patt_bound_evar n) (S dbi)
g: n > dbi
H0: compare_nat n dbi = Nat_greater n dbi g
eval ρ (patt_bound_evar (Nat.pred n)) = eval (update_evar_val x (evar_valuation ρ y) ρ) (patt_bound_evar (Nat.pred n))
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi, n: db_index
y: evar
Hsz: size (patt_bound_evar n) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (patt_bound_evar n)
Hwf: well_formed_closed_ex_aux (patt_bound_evar n) (S dbi)
l: n < dbi
H0: compare_nat n dbi = Nat_less n dbi l

eval ρ (patt_bound_evar n) = eval (update_evar_val x (evar_valuation ρ y) ρ) (patt_bound_evar n)
auto.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi, n: db_index
y: evar
Hsz: size (patt_bound_evar n) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (patt_bound_evar n)
Hwf: well_formed_closed_ex_aux (patt_bound_evar n) (S dbi)
e: n = dbi
H0: compare_nat n dbi = Nat_equal n dbi e

eval ρ (patt_free_evar y) = eval (update_evar_val x (evar_valuation ρ y) ρ) (patt_free_evar x)
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi, n: db_index
y: evar
Hsz: size (patt_bound_evar n) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (patt_bound_evar n)
Hwf: well_formed_closed_ex_aux (patt_bound_evar n) (S dbi)
e: n = dbi
H0: compare_nat n dbi = Nat_equal n dbi e

{[evar_valuation ρ y]} = {[evar_valuation (update_evar_val x (evar_valuation ρ y) ρ) x]}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi, n: db_index
y: evar
Hsz: size (patt_bound_evar n) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (patt_bound_evar n)
Hwf: well_formed_closed_ex_aux (patt_bound_evar n) (S dbi)
e: n = dbi
H0: compare_nat n dbi = Nat_equal n dbi e

{[evar_valuation ρ y]} = {[evar_valuation {| evar_valuation := λ ev' : evar, if decide (x = ev') then evar_valuation ρ y else evar_valuation ρ ev'; svar_valuation := svar_valuation ρ |} x]}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi, n: db_index
y: evar
Hsz: size (patt_bound_evar n) ≤ S sz
ρₑ: evar → M
ρₛ: svar → propset M
x: evar
H: evar_is_fresh_in x (patt_bound_evar n)
Hwf: well_formed_closed_ex_aux (patt_bound_evar n) (S dbi)
e: n = dbi
H0: compare_nat n dbi = Nat_equal n dbi e

{[evar_valuation {| evar_valuation := ρₑ; svar_valuation := ρₛ |} y]} = {[evar_valuation {| evar_valuation := λ ev' : evar, if decide (x = ev') then evar_valuation {| evar_valuation := ρₑ; svar_valuation := ρₛ |} y else evar_valuation {| evar_valuation := ρₑ; svar_valuation := ρₛ |} ev'; svar_valuation := svar_valuation {| evar_valuation := ρₑ; svar_valuation := ρₛ |} |} x]}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi, n: db_index
y: evar
Hsz: size (patt_bound_evar n) ≤ S sz
ρₑ: evar → M
ρₛ: svar → propset M
x: evar
H: evar_is_fresh_in x (patt_bound_evar n)
Hwf: well_formed_closed_ex_aux (patt_bound_evar n) (S dbi)
e: n = dbi
H0: compare_nat n dbi = Nat_equal n dbi e

{[ρₑ y]} = {[if decide (x = x) then ρₑ y else ρₑ x]}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi, n: db_index
y: evar
Hsz: size (patt_bound_evar n) ≤ S sz
ρₑ: evar → M
ρₛ: svar → propset M
x: evar
H: evar_is_fresh_in x (patt_bound_evar n)
Hwf: well_formed_closed_ex_aux (patt_bound_evar n) (S dbi)
e: n = dbi
H0: compare_nat n dbi = Nat_equal n dbi e
e0: x = x

{[ρₑ y]} = {[ρₑ y]}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi, n: db_index
y: evar
Hsz: size (patt_bound_evar n) ≤ S sz
ρₑ: evar → M
ρₛ: svar → propset M
x: evar
H: evar_is_fresh_in x (patt_bound_evar n)
Hwf: well_formed_closed_ex_aux (patt_bound_evar n) (S dbi)
e: n = dbi
H0: compare_nat n dbi = Nat_equal n dbi e
n0: x ≠ x
{[ρₑ y]} = {[ρₑ x]}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi, n: db_index
y: evar
Hsz: size (patt_bound_evar n) ≤ S sz
ρₑ: evar → M
ρₛ: svar → propset M
x: evar
H: evar_is_fresh_in x (patt_bound_evar n)
Hwf: well_formed_closed_ex_aux (patt_bound_evar n) (S dbi)
e: n = dbi
H0: compare_nat n dbi = Nat_equal n dbi e
n0: x ≠ x

{[ρₑ y]} = {[ρₑ x]}
contradiction.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi, n: db_index
y: evar
Hsz: size (patt_bound_evar n) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (patt_bound_evar n)
Hwf: well_formed_closed_ex_aux (patt_bound_evar n) (S dbi)
g: n > dbi
H0: compare_nat n dbi = Nat_greater n dbi g

eval ρ (patt_bound_evar (Nat.pred n)) = eval (update_evar_val x (evar_valuation ρ y) ρ) (patt_bound_evar (Nat.pred n))
auto.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi, n: db_index
y: evar
Hsz: size (patt_bound_svar n) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (patt_bound_svar n)
Hwf: well_formed_closed_ex_aux (patt_bound_svar n) (S dbi)

eval ρ (patt_bound_svar n) = eval (update_evar_val x (evar_valuation ρ y) ρ) (patt_bound_svar n)^{evar:dbi↦x}
rewrite 2!eval_bound_svar_simpl; auto.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
sigma: symbols
y: evar
Hsz: size (patt_sym sigma) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (patt_sym sigma)
Hwf: well_formed_closed_ex_aux (patt_sym sigma) (S dbi)

eval ρ (patt_sym sigma) = eval (update_evar_val x (evar_valuation ρ y) ρ) (patt_sym sigma)^{evar:dbi↦x}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
sigma: symbols
y: evar
Hsz: size (patt_sym sigma) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (patt_sym sigma)
Hwf: well_formed_closed_ex_aux (patt_sym sigma) (S dbi)

eval ρ (patt_sym sigma) = eval (update_evar_val x (evar_valuation ρ y) ρ) (patt_sym sigma)^{evar:dbi↦x}
repeat rewrite -> eval_sym_simpl; auto. (* HERE the duplication ends *)
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi1, phi2: Pattern
y: evar
Hsz: size (phi1 $ phi2) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (phi1 $ phi2)
Hwf: well_formed_closed_ex_aux (phi1 $ phi2) (S dbi)

eval ρ (phi1^[evar:dbi↦patt_free_evar y] $ phi2^[evar:dbi↦patt_free_evar y]) = eval (update_evar_val x (evar_valuation ρ y) ρ) (phi1 $ phi2)^{evar:dbi↦x}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi1, phi2: Pattern
y: evar
Hsz: size (phi1 $ phi2) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (phi1 $ phi2)
Hwf: well_formed_closed_ex_aux (phi1 $ phi2) (S dbi)

eval ρ (phi1^[evar:dbi↦patt_free_evar y] $ phi2^[evar:dbi↦patt_free_evar y]) = eval (update_evar_val x (evar_valuation ρ y) ρ) (phi1^{evar:dbi↦x} $ phi2^{evar:dbi↦x})
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi1, phi2: Pattern
y: evar
Hsz: size (phi1 $ phi2) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars (phi1 $ phi2)
Hwf: well_formed_closed_ex_aux (phi1 $ phi2) (S dbi)

eval ρ (phi1^[evar:dbi↦patt_free_evar y] $ phi2^[evar:dbi↦patt_free_evar y]) = eval (update_evar_val x (evar_valuation ρ y) ρ) (phi1^{evar:dbi↦x} $ phi2^{evar:dbi↦x})
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi1, phi2: Pattern
y: evar
Hsz: size (phi1 $ phi2) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi1 ∪ free_evars phi2
Hwf: well_formed_closed_ex_aux (phi1 $ phi2) (S dbi)

eval ρ (phi1^[evar:dbi↦patt_free_evar y] $ phi2^[evar:dbi↦patt_free_evar y]) = eval (update_evar_val x (evar_valuation ρ y) ρ) (phi1^{evar:dbi↦x} $ phi2^{evar:dbi↦x})
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi1, phi2: Pattern
y: evar
Hsz: size (phi1 $ phi2) ≤ S sz
ρ: Valuation
x: evar
H: (x ∉ free_evars phi1) ∧ x ∉ free_evars phi2
Hwf: well_formed_closed_ex_aux (phi1 $ phi2) (S dbi)

eval ρ (phi1^[evar:dbi↦patt_free_evar y] $ phi2^[evar:dbi↦patt_free_evar y]) = eval (update_evar_val x (evar_valuation ρ y) ρ) (phi1^{evar:dbi↦x} $ phi2^{evar:dbi↦x})
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi1, phi2: Pattern
y: evar
Hsz: size (phi1 $ phi2) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi1
H0: x ∉ free_evars phi2
Hwf: well_formed_closed_ex_aux (phi1 $ phi2) (S dbi)

eval ρ (phi1^[evar:dbi↦patt_free_evar y] $ phi2^[evar:dbi↦patt_free_evar y]) = eval (update_evar_val x (evar_valuation ρ y) ρ) (phi1^{evar:dbi↦x} $ phi2^{evar:dbi↦x})
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi1, phi2: Pattern
y: evar
Hsz: size (phi1 $ phi2) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi1
H0: x ∉ free_evars phi2
Hwf: well_formed_closed_ex_aux (phi1 $ phi2) (S dbi)

app_ext (eval ρ phi1^[evar:dbi↦patt_free_evar y]) (eval ρ phi2^[evar:dbi↦patt_free_evar y]) = app_ext (eval (update_evar_val x (evar_valuation ρ y) ρ) phi1^{evar:dbi↦x}) (eval (update_evar_val x (evar_valuation ρ y) ρ) phi2^{evar:dbi↦x})
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi1, phi2: Pattern
y: evar
Hsz: S (size phi1 + size phi2) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi1
H0: x ∉ free_evars phi2
Hwf: well_formed_closed_ex_aux (phi1 $ phi2) (S dbi)

app_ext (eval ρ phi1^[evar:dbi↦patt_free_evar y]) (eval ρ phi2^[evar:dbi↦patt_free_evar y]) = app_ext (eval (update_evar_val x (evar_valuation ρ y) ρ) phi1^{evar:dbi↦x}) (eval (update_evar_val x (evar_valuation ρ y) ρ) phi2^{evar:dbi↦x})
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi1, phi2: Pattern
y: evar
Hsz: S (size phi1 + size phi2) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi1
H0: x ∉ free_evars phi2
Hwf: well_formed_closed_ex_aux (phi1 $ phi2) (S dbi)

app_ext (eval ρ phi1^[evar:dbi↦patt_free_evar y]) (eval ρ phi2^[evar:dbi↦patt_free_evar y]) = app_ext (eval ρ phi1^[evar:dbi↦patt_free_evar y]) (eval ρ phi2^[evar:dbi↦patt_free_evar y])
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi1, phi2: Pattern
y: evar
Hsz: S (size phi1 + size phi2) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi1
H0: x ∉ free_evars phi2
Hwf: well_formed_closed_ex_aux (phi1 $ phi2) (S dbi)
size phi2 ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi1, phi2: Pattern
y: evar
Hsz: S (size phi1 + size phi2) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi1
H0: x ∉ free_evars phi2
Hwf: well_formed_closed_ex_aux (phi1 $ phi2) (S dbi)
evar_is_fresh_in x phi2
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi1, phi2: Pattern
y: evar
Hsz: S (size phi1 + size phi2) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi1
H0: x ∉ free_evars phi2
Hwf: well_formed_closed_ex_aux (phi1 $ phi2) (S dbi)
well_formed_closed_ex_aux phi2 (S dbi)
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi1, phi2: Pattern
y: evar
Hsz: S (size phi1 + size phi2) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi1
H0: x ∉ free_evars phi2
Hwf: well_formed_closed_ex_aux (phi1 $ phi2) (S dbi)
size phi1 ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi1, phi2: Pattern
y: evar
Hsz: S (size phi1 + size phi2) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi1
H0: x ∉ free_evars phi2
Hwf: well_formed_closed_ex_aux (phi1 $ phi2) (S dbi)
evar_is_fresh_in x phi1
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi1, phi2: Pattern
y: evar
Hsz: S (size phi1 + size phi2) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi1
H0: x ∉ free_evars phi2
Hwf: well_formed_closed_ex_aux (phi1 $ phi2) (S dbi)
well_formed_closed_ex_aux phi1 (S dbi)
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi1, phi2: Pattern
y: evar
Hsz: S (size phi1 + size phi2) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi1
H0: x ∉ free_evars phi2
Hwf: well_formed_closed_ex_aux (phi1 $ phi2) (S dbi)

app_ext (eval ρ phi1^[evar:dbi↦patt_free_evar y]) (eval ρ phi2^[evar:dbi↦patt_free_evar y]) = app_ext (eval ρ phi1^[evar:dbi↦patt_free_evar y]) (eval ρ phi2^[evar:dbi↦patt_free_evar y])
reflexivity.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi1, phi2: Pattern
y: evar
Hsz: S (size phi1 + size phi2) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi1
H0: x ∉ free_evars phi2
Hwf: well_formed_closed_ex_aux (phi1 $ phi2) (S dbi)

size phi2 ≤ sz
lia.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi1, phi2: Pattern
y: evar
Hsz: S (size phi1 + size phi2) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi1
H0: x ∉ free_evars phi2
Hwf: well_formed_closed_ex_aux (phi1 $ phi2) (S dbi)

evar_is_fresh_in x phi2
assumption.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi1, phi2: Pattern
y: evar
Hsz: S (size phi1 + size phi2) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi1
H0: x ∉ free_evars phi2
Hwf: well_formed_closed_ex_aux (phi1 $ phi2) (S dbi)

well_formed_closed_ex_aux phi2 (S dbi)
now apply andb_true_iff in Hwf.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi1, phi2: Pattern
y: evar
Hsz: S (size phi1 + size phi2) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi1
H0: x ∉ free_evars phi2
Hwf: well_formed_closed_ex_aux (phi1 $ phi2) (S dbi)

size phi1 ≤ sz
lia.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi1, phi2: Pattern
y: evar
Hsz: S (size phi1 + size phi2) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi1
H0: x ∉ free_evars phi2
Hwf: well_formed_closed_ex_aux (phi1 $ phi2) (S dbi)

evar_is_fresh_in x phi1
auto.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi1, phi2: Pattern
y: evar
Hsz: S (size phi1 + size phi2) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi1
H0: x ∉ free_evars phi2
Hwf: well_formed_closed_ex_aux (phi1 $ phi2) (S dbi)

well_formed_closed_ex_aux phi1 (S dbi)
now apply andb_true_iff in Hwf.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
y: evar
Hsz: size ⊥ ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x ⊥
Hwf: well_formed_closed_ex_aux ⊥ (S dbi)

eval ρ ⊥ = eval (update_evar_val x (evar_valuation ρ y) ρ) ⊥^{evar:dbi↦x}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
y: evar
Hsz: size ⊥ ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x ⊥
Hwf: well_formed_closed_ex_aux ⊥ (S dbi)

eval ρ ⊥ = eval (update_evar_val x (evar_valuation ρ y) ρ) ⊥^{evar:dbi↦x}
repeat rewrite eval_bott_simpl; auto.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi1, phi2: Pattern
y: evar
Hsz: size (phi1 ---> phi2) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (phi1 ---> phi2)
Hwf: well_formed_closed_ex_aux (phi1 ---> phi2) (S dbi)

eval ρ (phi1^[evar:dbi↦patt_free_evar y] ---> phi2^[evar:dbi↦patt_free_evar y]) = eval (update_evar_val x (evar_valuation ρ y) ρ) (phi1 ---> phi2)^{evar:dbi↦x}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi1, phi2: Pattern
y: evar
Hsz: size (phi1 ---> phi2) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (phi1 ---> phi2)
Hwf: well_formed_closed_ex_aux (phi1 ---> phi2) (S dbi)

eval ρ (phi1^[evar:dbi↦patt_free_evar y] ---> phi2^[evar:dbi↦patt_free_evar y]) = eval (update_evar_val x (evar_valuation ρ y) ρ) (phi1^{evar:dbi↦x} ---> phi2^{evar:dbi↦x})
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi1, phi2: Pattern
y: evar
Hsz: S (size phi1 + size phi2) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (phi1 ---> phi2)
Hwf: well_formed_closed_ex_aux (phi1 ---> phi2) (S dbi)

eval ρ (phi1^[evar:dbi↦patt_free_evar y] ---> phi2^[evar:dbi↦patt_free_evar y]) = eval (update_evar_val x (evar_valuation ρ y) ρ) (phi1^{evar:dbi↦x} ---> phi2^{evar:dbi↦x})
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi1, phi2: Pattern
y: evar
Hsz: S (size phi1 + size phi2) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars (phi1 ---> phi2)
Hwf: well_formed_closed_ex_aux (phi1 ---> phi2) (S dbi)

eval ρ (phi1^[evar:dbi↦patt_free_evar y] ---> phi2^[evar:dbi↦patt_free_evar y]) = eval (update_evar_val x (evar_valuation ρ y) ρ) (phi1^{evar:dbi↦x} ---> phi2^{evar:dbi↦x})
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi1, phi2: Pattern
y: evar
Hsz: S (size phi1 + size phi2) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi1 ∪ free_evars phi2
Hwf: well_formed_closed_ex_aux (phi1 ---> phi2) (S dbi)

eval ρ (phi1^[evar:dbi↦patt_free_evar y] ---> phi2^[evar:dbi↦patt_free_evar y]) = eval (update_evar_val x (evar_valuation ρ y) ρ) (phi1^{evar:dbi↦x} ---> phi2^{evar:dbi↦x})
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi1, phi2: Pattern
y: evar
Hsz: S (size phi1 + size phi2) ≤ S sz
ρ: Valuation
x: evar
H: (x ∉ free_evars phi1) ∧ x ∉ free_evars phi2
Hwf: well_formed_closed_ex_aux (phi1 ---> phi2) (S dbi)

eval ρ (phi1^[evar:dbi↦patt_free_evar y] ---> phi2^[evar:dbi↦patt_free_evar y]) = eval (update_evar_val x (evar_valuation ρ y) ρ) (phi1^{evar:dbi↦x} ---> phi2^{evar:dbi↦x})
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi1, phi2: Pattern
y: evar
Hsz: S (size phi1 + size phi2) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi1
H0: x ∉ free_evars phi2
Hwf: well_formed_closed_ex_aux (phi1 ---> phi2) (S dbi)

eval ρ (phi1^[evar:dbi↦patt_free_evar y] ---> phi2^[evar:dbi↦patt_free_evar y]) = eval (update_evar_val x (evar_valuation ρ y) ρ) (phi1^{evar:dbi↦x} ---> phi2^{evar:dbi↦x})
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi1, phi2: Pattern
y: evar
Hsz: S (size phi1 + size phi2) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi1
H0: x ∉ free_evars phi2
Hwf: well_formed_closed_ex_aux (phi1 ---> phi2) (S dbi)

⊤ ∖ eval ρ phi1^[evar:dbi↦patt_free_evar y] ∪ eval ρ phi2^[evar:dbi↦patt_free_evar y] = ⊤ ∖ eval (update_evar_val x (evar_valuation ρ y) ρ) phi1^{evar:dbi↦x} ∪ eval (update_evar_val x (evar_valuation ρ y) ρ) phi2^{evar:dbi↦x}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi1, phi2: Pattern
y: evar
Hsz: S (size phi1 + size phi2) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi1
H0: x ∉ free_evars phi2
Hwf: well_formed_closed_ex_aux (phi1 ---> phi2) (S dbi)

⊤ ∖ eval ρ phi1^[evar:dbi↦patt_free_evar y] ∪ eval ρ phi2^[evar:dbi↦patt_free_evar y] = ⊤ ∖ eval ρ phi1^[evar:dbi↦patt_free_evar y] ∪ eval ρ phi2^[evar:dbi↦patt_free_evar y]
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi1, phi2: Pattern
y: evar
Hsz: S (size phi1 + size phi2) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi1
H0: x ∉ free_evars phi2
Hwf: well_formed_closed_ex_aux (phi1 ---> phi2) (S dbi)
size phi2 ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi1, phi2: Pattern
y: evar
Hsz: S (size phi1 + size phi2) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi1
H0: x ∉ free_evars phi2
Hwf: well_formed_closed_ex_aux (phi1 ---> phi2) (S dbi)
evar_is_fresh_in x phi2
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi1, phi2: Pattern
y: evar
Hsz: S (size phi1 + size phi2) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi1
H0: x ∉ free_evars phi2
Hwf: well_formed_closed_ex_aux (phi1 ---> phi2) (S dbi)
well_formed_closed_ex_aux phi2 (S dbi)
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi1, phi2: Pattern
y: evar
Hsz: S (size phi1 + size phi2) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi1
H0: x ∉ free_evars phi2
Hwf: well_formed_closed_ex_aux (phi1 ---> phi2) (S dbi)
size phi1 ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi1, phi2: Pattern
y: evar
Hsz: S (size phi1 + size phi2) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi1
H0: x ∉ free_evars phi2
Hwf: well_formed_closed_ex_aux (phi1 ---> phi2) (S dbi)
evar_is_fresh_in x phi1
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi1, phi2: Pattern
y: evar
Hsz: S (size phi1 + size phi2) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi1
H0: x ∉ free_evars phi2
Hwf: well_formed_closed_ex_aux (phi1 ---> phi2) (S dbi)
well_formed_closed_ex_aux phi1 (S dbi)
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi1, phi2: Pattern
y: evar
Hsz: S (size phi1 + size phi2) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi1
H0: x ∉ free_evars phi2
Hwf: well_formed_closed_ex_aux (phi1 ---> phi2) (S dbi)

⊤ ∖ eval ρ phi1^[evar:dbi↦patt_free_evar y] ∪ eval ρ phi2^[evar:dbi↦patt_free_evar y] = ⊤ ∖ eval ρ phi1^[evar:dbi↦patt_free_evar y] ∪ eval ρ phi2^[evar:dbi↦patt_free_evar y]
reflexivity.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi1, phi2: Pattern
y: evar
Hsz: S (size phi1 + size phi2) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi1
H0: x ∉ free_evars phi2
Hwf: well_formed_closed_ex_aux (phi1 ---> phi2) (S dbi)

size phi2 ≤ sz
lia.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi1, phi2: Pattern
y: evar
Hsz: S (size phi1 + size phi2) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi1
H0: x ∉ free_evars phi2
Hwf: well_formed_closed_ex_aux (phi1 ---> phi2) (S dbi)

evar_is_fresh_in x phi2
assumption.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi1, phi2: Pattern
y: evar
Hsz: S (size phi1 + size phi2) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi1
H0: x ∉ free_evars phi2
Hwf: well_formed_closed_ex_aux (phi1 ---> phi2) (S dbi)

well_formed_closed_ex_aux phi2 (S dbi)
now apply andb_true_iff in Hwf.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi1, phi2: Pattern
y: evar
Hsz: S (size phi1 + size phi2) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi1
H0: x ∉ free_evars phi2
Hwf: well_formed_closed_ex_aux (phi1 ---> phi2) (S dbi)

size phi1 ≤ sz
lia.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi1, phi2: Pattern
y: evar
Hsz: S (size phi1 + size phi2) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi1
H0: x ∉ free_evars phi2
Hwf: well_formed_closed_ex_aux (phi1 ---> phi2) (S dbi)

evar_is_fresh_in x phi1
auto.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi1, phi2: Pattern
y: evar
Hsz: S (size phi1 + size phi2) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi1
H0: x ∉ free_evars phi2
Hwf: well_formed_closed_ex_aux (phi1 ---> phi2) (S dbi)

well_formed_closed_ex_aux phi1 (S dbi)
now apply andb_true_iff in Hwf.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (ex , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (ex , phi)
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)

eval ρ (ex , phi^[evar:S dbi↦patt_free_evar y]) = eval (update_evar_val x (evar_valuation ρ y) ρ) (ex , phi)^{evar:dbi↦x}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (ex , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (ex , phi)
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)

eval ρ (ex , phi^[evar:S dbi↦patt_free_evar y]) = eval (update_evar_val x (evar_valuation ρ y) ρ) (ex , phi^{evar:S dbi↦x})
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (ex , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (ex , phi)
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)

eval ρ (ex , phi^[evar:S dbi↦patt_free_evar y]) = eval (update_evar_val x (evar_valuation ρ y) ρ) (ex , phi^{evar:S dbi↦x})
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (ex , phi)
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)

eval ρ (ex , phi^[evar:S dbi↦patt_free_evar y]) = eval (update_evar_val x (evar_valuation ρ y) ρ) (ex , phi^{evar:S dbi↦x})
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars (ex , phi)
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)

eval ρ (ex , phi^[evar:S dbi↦patt_free_evar y]) = eval (update_evar_val x (evar_valuation ρ y) ρ) (ex , phi^{evar:S dbi↦x})
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)

eval ρ (ex , phi^[evar:S dbi↦patt_free_evar y]) = eval (update_evar_val x (evar_valuation ρ y) ρ) (ex , phi^{evar:S dbi↦x})
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)

(let x := fresh_evar phi^[evar:S dbi↦patt_free_evar y] in propset_fa_union (λ e : M, let ρ' := update_evar_val x e ρ in eval ρ' phi^[evar:S dbi↦patt_free_evar y]^{evar:0↦x})) = (let x0 := fresh_evar phi^{evar:S dbi↦x} in propset_fa_union (λ e : M, let ρ' := update_evar_val x0 e (update_evar_val x (evar_valuation ρ y) ρ) in eval ρ' phi^{evar:S dbi↦x}^{evar:0↦x0}))
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)

propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar phi^[evar:S dbi↦patt_free_evar y]) e ρ) phi^[evar:S dbi↦patt_free_evar y]^{evar:0↦fresh_evar phi^[evar: S dbi↦ patt_free_evar y]}) = propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar phi^{evar:S dbi↦x}) e (update_evar_val x (evar_valuation ρ y) ρ)) phi^{evar:S dbi↦x}^{evar:0↦fresh_evar phi^{evar:S dbi↦x}})
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)

c : M, eval (update_evar_val (fresh_evar phi^[evar:S dbi↦patt_free_evar y]) c ρ) phi^[evar:S dbi↦patt_free_evar y]^{evar:0↦fresh_evar phi^[evar: S dbi↦ patt_free_evar y]} = eval (update_evar_val (fresh_evar phi^{evar:S dbi↦x}) c (update_evar_val x (evar_valuation ρ y) ρ)) phi^{evar:S dbi↦x}^{evar:0↦fresh_evar phi^{evar:S dbi↦x}}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M

eval (update_evar_val (fresh_evar phi^[evar:S dbi↦patt_free_evar y]) c ρ) phi^[evar:S dbi↦patt_free_evar y]^{evar:0↦fresh_evar phi^[evar: S dbi↦ patt_free_evar y]} = eval (update_evar_val (fresh_evar phi^{evar:S dbi↦x}) c (update_evar_val x (evar_valuation ρ y) ρ)) phi^{evar:S dbi↦x}^{evar:0↦fresh_evar phi^{evar:S dbi↦x}}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]

eval (update_evar_val x' c ρ) phi^[evar:S dbi↦patt_free_evar y]^{evar:0↦x'} = eval (update_evar_val (fresh_evar phi^{evar:S dbi↦x}) c (update_evar_val x (evar_valuation ρ y) ρ)) phi^{evar:S dbi↦x}^{evar:0↦fresh_evar phi^{evar:S dbi↦x}}
(* rewrite evar_open_bevar_subst_higher. { auto. } { lia. } *)
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
phi': Pattern
Heqphi': phi' = phi^{evar:S dbi↦x}

eval (update_evar_val x' c ρ) phi^[evar:S dbi↦patt_free_evar y]^{evar:0↦x'} = eval (update_evar_val (fresh_evar phi') c (update_evar_val x (evar_valuation ρ y) ρ)) phi'^{evar:0↦fresh_evar phi'}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
phi': Pattern
Heqphi': phi' = phi^{evar:S dbi↦x}
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi'

eval (update_evar_val x' c ρ) phi^[evar:S dbi↦patt_free_evar y]^{evar:0↦x'} = eval (update_evar_val Xfr' c (update_evar_val x (evar_valuation ρ y) ρ)) phi'^{evar:0↦Xfr'}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
phi': Pattern
Heqphi': phi' = phi^{evar:S dbi↦x}
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi'
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi' ∪ {[x']}))

eval (update_evar_val x' c ρ) phi^[evar:S dbi↦patt_free_evar y]^{evar:0↦x'} = eval (update_evar_val Xfr' c (update_evar_val x (evar_valuation ρ y) ρ)) phi'^{evar:0↦Xfr'}
(* The same destruct as in the mu case of the set substitution lemma *) (* destruct (bevar_occur phi (S dbi)) eqn:Hbevar. *)
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
phi': Pattern
Heqphi': phi' = phi^{evar:S dbi↦x}
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi'
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi' ∪ {[x']}))

eval (update_evar_val x' c ρ) phi^[evar:S dbi↦patt_free_evar y]^{evar:0↦x'} = eval (update_evar_val Xfr' c (update_evar_val x (evar_valuation ρ y) ρ)) phi'^{evar:0↦Xfr'}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
phi': Pattern
Heqphi': phi' = phi^{evar:S dbi↦x}
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi'
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi' ∪ {[x']}))

well_formed_closed_ex_aux (patt_free_evar y) 0
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
phi': Pattern
Heqphi': phi' = phi^{evar:S dbi↦x}
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi'
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi' ∪ {[x']}))
0 < S dbi
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
phi': Pattern
Heqphi': phi' = phi^{evar:S dbi↦x}
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi'
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi' ∪ {[x']}))
eval (update_evar_val x' c ρ) phi^{evar:0↦x'}^[evar: Init.Nat.pred (S dbi)↦ patt_free_evar y] = eval (update_evar_val Xfr' c (update_evar_val x (evar_valuation ρ y) ρ)) phi'^{evar:0↦Xfr'}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
phi': Pattern
Heqphi': phi' = phi^{evar:S dbi↦x}
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi'
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi' ∪ {[x']}))

well_formed_closed_ex_aux (patt_free_evar y) 0
auto.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
phi': Pattern
Heqphi': phi' = phi^{evar:S dbi↦x}
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi'
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi' ∪ {[x']}))

0 < S dbi
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
phi': Pattern
Heqphi': phi' = phi^{evar:S dbi↦x}
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi'
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi' ∪ {[x']}))
eval (update_evar_val x' c ρ) phi^{evar:0↦x'}^[evar: Init.Nat.pred (S dbi)↦ patt_free_evar y] = eval (update_evar_val Xfr' c (update_evar_val x (evar_valuation ρ y) ρ)) phi'^{evar:0↦Xfr'}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
phi': Pattern
Heqphi': phi' = phi^{evar:S dbi↦x}
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi'
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi' ∪ {[x']}))

0 < S dbi
lia.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
phi': Pattern
Heqphi': phi' = phi^{evar:S dbi↦x}
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi'
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi' ∪ {[x']}))

eval (update_evar_val x' c ρ) phi^{evar:0↦x'}^[evar:Init.Nat.pred (S dbi)↦patt_free_evar y] = eval (update_evar_val Xfr' c (update_evar_val x (evar_valuation ρ y) ρ)) phi'^{evar:0↦Xfr'}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
phi': Pattern
Heqphi': phi' = phi^{evar:S dbi↦x}
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi'
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi' ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi' ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}

eval (update_evar_val x' c ρ) phi^{evar:0↦x'}^[evar:Init.Nat.pred (S dbi)↦patt_free_evar y] = eval (update_evar_val Xfr' c (update_evar_val x (evar_valuation ρ y) ρ)) phi'^{evar:0↦Xfr'}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
phi': Pattern
Heqphi': phi' = phi^{evar:S dbi↦x}
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi'
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi' ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi' ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)

eval (update_evar_val x' c ρ) phi^{evar:0↦x'}^[evar:Init.Nat.pred (S dbi)↦patt_free_evar y] = eval (update_evar_val Xfr' c (update_evar_val x (evar_valuation ρ y) ρ)) phi'^{evar:0↦Xfr'}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
phi': Pattern
Heqphi': phi' = phi^{evar:S dbi↦x}
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi'
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi' ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi' ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)

yB ≠ x
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
phi': Pattern
Heqphi': phi' = phi^{evar:S dbi↦x}
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi'
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi' ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi' ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
eval (update_evar_val x' c ρ) phi^{evar:0↦x'}^[evar: Init.Nat.pred (S dbi)↦ patt_free_evar y] = eval (update_evar_val Xfr' c (update_evar_val x (evar_valuation ρ y) ρ)) phi'^{evar:0↦Xfr'}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
phi': Pattern
Heqphi': phi' = phi^{evar:S dbi↦x}
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi'
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi' ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi' ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)

yB ≠ x
solve_fresh_neq.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
phi': Pattern
Heqphi': phi' = phi^{evar:S dbi↦x}
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi'
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi' ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi' ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x

eval (update_evar_val x' c ρ) phi^{evar:0↦x'}^[evar:Init.Nat.pred (S dbi)↦patt_free_evar y] = eval (update_evar_val Xfr' c (update_evar_val x (evar_valuation ρ y) ρ)) phi'^{evar:0↦Xfr'}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
phi': Pattern
Heqphi': phi' = phi^{evar:S dbi↦x}
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi'
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi' ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi' ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x

yB ≠ Xfr'
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
phi': Pattern
Heqphi': phi' = phi^{evar:S dbi↦x}
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi'
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi' ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi' ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
eval (update_evar_val x' c ρ) phi^{evar:0↦x'}^[evar: Init.Nat.pred (S dbi)↦ patt_free_evar y] = eval (update_evar_val Xfr' c (update_evar_val x (evar_valuation ρ y) ρ)) phi'^{evar:0↦Xfr'}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
phi': Pattern
Heqphi': phi' = phi^{evar:S dbi↦x}
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi'
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi' ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi' ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x

yB ≠ Xfr'
solve_fresh_neq.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
phi': Pattern
Heqphi': phi' = phi^{evar:S dbi↦x}
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi'
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi' ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi' ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'

eval (update_evar_val x' c ρ) phi^{evar:0↦x'}^[evar:Init.Nat.pred (S dbi)↦patt_free_evar y] = eval (update_evar_val Xfr' c (update_evar_val x (evar_valuation ρ y) ρ)) phi'^{evar:0↦Xfr'}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
phi': Pattern
Heqphi': phi' = phi^{evar:S dbi↦x}
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi'
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi' ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi' ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'

yB ≠ y
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
phi': Pattern
Heqphi': phi' = phi^{evar:S dbi↦x}
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi'
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi' ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi' ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
eval (update_evar_val x' c ρ) phi^{evar:0↦x'}^[evar: Init.Nat.pred (S dbi)↦ patt_free_evar y] = eval (update_evar_val Xfr' c (update_evar_val x (evar_valuation ρ y) ρ)) phi'^{evar:0↦Xfr'}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
phi': Pattern
Heqphi': phi' = phi^{evar:S dbi↦x}
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi'
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi' ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi' ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'

yB ≠ y
solve_fresh_neq.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
phi': Pattern
Heqphi': phi' = phi^{evar:S dbi↦x}
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi'
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi' ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi' ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y

eval (update_evar_val x' c ρ) phi^{evar:0↦x'}^[evar:Init.Nat.pred (S dbi)↦patt_free_evar y] = eval (update_evar_val Xfr' c (update_evar_val x (evar_valuation ρ y) ρ)) phi'^{evar:0↦Xfr'}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
phi': Pattern
Heqphi': phi' = phi^{evar:S dbi↦x}
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi'
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi' ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi' ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y

evar_is_fresh_in yB phi
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
phi': Pattern
Heqphi': phi' = phi^{evar:S dbi↦x}
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi'
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi' ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi' ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
eval (update_evar_val x' c ρ) phi^{evar:0↦x'}^[evar: Init.Nat.pred (S dbi)↦ patt_free_evar y] = eval (update_evar_val Xfr' c (update_evar_val x (evar_valuation ρ y) ρ)) phi'^{evar:0↦Xfr'}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
phi': Pattern
Heqphi': phi' = phi^{evar:S dbi↦x}
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi'
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi' ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi' ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y

evar_is_fresh_in yB phi
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
HyBy: evar_fresh (elements (free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦ patt_free_evar y] ∪ {[fresh_evar phi^{evar:S dbi↦x}]} ∪ {[x]} ∪ {[y]})) ≠ y
HyBXfr': evar_fresh (elements (free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦ patt_free_evar y] ∪ {[fresh_evar phi^{evar:S dbi↦x}]} ∪ {[x]} ∪ {[y]})) ≠ fresh_evar phi^{evar:S dbi↦x}
HyBx: evar_fresh (elements (free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦ patt_free_evar y] ∪ {[fresh_evar phi^{evar:S dbi↦x}]} ∪ {[x]} ∪ {[y]})) ≠ x

evar_is_fresh_in (evar_fresh (elements (free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[fresh_evar phi^{evar:S dbi↦x}]} ∪ {[x]} ∪ {[y]}))) phi
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
HyBy: evar_fresh (elements (free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦ patt_free_evar y] ∪ {[fresh_evar phi^{evar:S dbi↦x}]} ∪ {[x]} ∪ {[y]})) ≠ y
HyBXfr': evar_fresh (elements (free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦ patt_free_evar y] ∪ {[fresh_evar phi^{evar:S dbi↦x}]} ∪ {[x]} ∪ {[y]})) ≠ fresh_evar phi^{evar:S dbi↦x}
HyBx: evar_fresh (elements (free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦ patt_free_evar y] ∪ {[fresh_evar phi^{evar:S dbi↦x}]} ∪ {[x]} ∪ {[y]})) ≠ x

free_evars phi ⊆ ?B
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
HyBy: evar_fresh (elements (free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦ patt_free_evar y] ∪ {[fresh_evar phi^{evar:S dbi↦x}]} ∪ {[x]} ∪ {[y]})) ≠ y
HyBXfr': evar_fresh (elements (free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦ patt_free_evar y] ∪ {[fresh_evar phi^{evar:S dbi↦x}]} ∪ {[x]} ∪ {[y]})) ≠ fresh_evar phi^{evar:S dbi↦x}
HyBx: evar_fresh (elements (free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦ patt_free_evar y] ∪ {[fresh_evar phi^{evar:S dbi↦x}]} ∪ {[x]} ∪ {[y]})) ≠ x
evar_fresh (elements (free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[fresh_evar phi^{evar:S dbi↦x}]} ∪ {[x]} ∪ {[y]})) ∉ ?B
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
HyBy: evar_fresh (elements (free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦ patt_free_evar y] ∪ {[fresh_evar phi^{evar:S dbi↦x}]} ∪ {[x]} ∪ {[y]})) ≠ y
HyBXfr': evar_fresh (elements (free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦ patt_free_evar y] ∪ {[fresh_evar phi^{evar:S dbi↦x}]} ∪ {[x]} ∪ {[y]})) ≠ fresh_evar phi^{evar:S dbi↦x}
HyBx: evar_fresh (elements (free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦ patt_free_evar y] ∪ {[fresh_evar phi^{evar:S dbi↦x}]} ∪ {[x]} ∪ {[y]})) ≠ x

free_evars phi ⊆ free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[fresh_evar phi^{evar:S dbi↦x}]} ∪ {[x]} ∪ {[y]}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
HyBy: evar_fresh (elements (free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦ patt_free_evar y] ∪ {[fresh_evar phi^{evar:S dbi↦x}]} ∪ {[x]} ∪ {[y]})) ≠ y
HyBXfr': evar_fresh (elements (free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦ patt_free_evar y] ∪ {[fresh_evar phi^{evar:S dbi↦x}]} ∪ {[x]} ∪ {[y]})) ≠ fresh_evar phi^{evar:S dbi↦x}
HyBx: evar_fresh (elements (free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦ patt_free_evar y] ∪ {[fresh_evar phi^{evar:S dbi↦x}]} ∪ {[x]} ∪ {[y]})) ≠ x

free_evars phi ⊆ free_evars phi ∪ free_evars phi^{evar:S dbi↦x}
apply union_subseteq_l.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
phi': Pattern
Heqphi': phi' = phi^{evar:S dbi↦x}
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi'
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi' ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi' ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi

eval (update_evar_val x' c ρ) phi^{evar:0↦x'}^[evar:Init.Nat.pred (S dbi)↦patt_free_evar y] = eval (update_evar_val Xfr' c (update_evar_val x (evar_valuation ρ y) ρ)) phi'^{evar:0↦Xfr'}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
phi': Pattern
Heqphi': phi' = phi^{evar:S dbi↦x}
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi'
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi' ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi' ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi

evar_is_fresh_in yB phi'
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
phi': Pattern
Heqphi': phi' = phi^{evar:S dbi↦x}
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi'
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi' ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi' ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi'
eval (update_evar_val x' c ρ) phi^{evar:0↦x'}^[evar: Init.Nat.pred (S dbi)↦ patt_free_evar y] = eval (update_evar_val Xfr' c (update_evar_val x (evar_valuation ρ y) ρ)) phi'^{evar:0↦Xfr'}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
phi': Pattern
Heqphi': phi' = phi^{evar:S dbi↦x}
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi'
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi' ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi' ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi

evar_is_fresh_in yB phi'
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
HyBfphi: evar_is_fresh_in (evar_fresh (elements (free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar: S dbi↦patt_free_evar y] ∪ {[fresh_evar phi^{evar:S dbi↦x}]} ∪ {[x]} ∪ {[y]}))) phi
HyBy: evar_fresh (elements (free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦ patt_free_evar y] ∪ {[fresh_evar phi^{evar:S dbi↦x}]} ∪ {[x]} ∪ {[y]})) ≠ y
HyBXfr': evar_fresh (elements (free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦ patt_free_evar y] ∪ {[fresh_evar phi^{evar:S dbi↦x}]} ∪ {[x]} ∪ {[y]})) ≠ fresh_evar phi^{evar:S dbi↦x}
HyBx: evar_fresh (elements (free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦ patt_free_evar y] ∪ {[fresh_evar phi^{evar:S dbi↦x}]} ∪ {[x]} ∪ {[y]})) ≠ x

evar_is_fresh_in (evar_fresh (elements (free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[fresh_evar phi^{evar:S dbi↦x}]} ∪ {[x]} ∪ {[y]}))) phi^{evar:S dbi↦x}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
HyBfphi: evar_is_fresh_in (evar_fresh (elements (free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar: S dbi↦patt_free_evar y] ∪ {[fresh_evar phi^{evar:S dbi↦x}]} ∪ {[x]} ∪ {[y]}))) phi
HyBy: evar_fresh (elements (free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦ patt_free_evar y] ∪ {[fresh_evar phi^{evar:S dbi↦x}]} ∪ {[x]} ∪ {[y]})) ≠ y
HyBXfr': evar_fresh (elements (free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦ patt_free_evar y] ∪ {[fresh_evar phi^{evar:S dbi↦x}]} ∪ {[x]} ∪ {[y]})) ≠ fresh_evar phi^{evar:S dbi↦x}
HyBx: evar_fresh (elements (free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦ patt_free_evar y] ∪ {[fresh_evar phi^{evar:S dbi↦x}]} ∪ {[x]} ∪ {[y]})) ≠ x

free_evars phi^{evar:S dbi↦x} ⊆ ?B
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
HyBfphi: evar_is_fresh_in (evar_fresh (elements (free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar: S dbi↦patt_free_evar y] ∪ {[fresh_evar phi^{evar:S dbi↦x}]} ∪ {[x]} ∪ {[y]}))) phi
HyBy: evar_fresh (elements (free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦ patt_free_evar y] ∪ {[fresh_evar phi^{evar:S dbi↦x}]} ∪ {[x]} ∪ {[y]})) ≠ y
HyBXfr': evar_fresh (elements (free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦ patt_free_evar y] ∪ {[fresh_evar phi^{evar:S dbi↦x}]} ∪ {[x]} ∪ {[y]})) ≠ fresh_evar phi^{evar:S dbi↦x}
HyBx: evar_fresh (elements (free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦ patt_free_evar y] ∪ {[fresh_evar phi^{evar:S dbi↦x}]} ∪ {[x]} ∪ {[y]})) ≠ x
evar_fresh (elements (free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[fresh_evar phi^{evar:S dbi↦x}]} ∪ {[x]} ∪ {[y]})) ∉ ?B
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
HyBfphi: evar_is_fresh_in (evar_fresh (elements (free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar: S dbi↦patt_free_evar y] ∪ {[fresh_evar phi^{evar:S dbi↦x}]} ∪ {[x]} ∪ {[y]}))) phi
HyBy: evar_fresh (elements (free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦ patt_free_evar y] ∪ {[fresh_evar phi^{evar:S dbi↦x}]} ∪ {[x]} ∪ {[y]})) ≠ y
HyBXfr': evar_fresh (elements (free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦ patt_free_evar y] ∪ {[fresh_evar phi^{evar:S dbi↦x}]} ∪ {[x]} ∪ {[y]})) ≠ fresh_evar phi^{evar:S dbi↦x}
HyBx: evar_fresh (elements (free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦ patt_free_evar y] ∪ {[fresh_evar phi^{evar:S dbi↦x}]} ∪ {[x]} ∪ {[y]})) ≠ x

free_evars phi^{evar:S dbi↦x} ⊆ free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[fresh_evar phi^{evar:S dbi↦x}]} ∪ {[x]} ∪ {[y]}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
HyBfphi: evar_is_fresh_in (evar_fresh (elements (free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar: S dbi↦patt_free_evar y] ∪ {[fresh_evar phi^{evar:S dbi↦x}]} ∪ {[x]} ∪ {[y]}))) phi
HyBy: evar_fresh (elements (free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦ patt_free_evar y] ∪ {[fresh_evar phi^{evar:S dbi↦x}]} ∪ {[x]} ∪ {[y]})) ≠ y
HyBXfr': evar_fresh (elements (free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦ patt_free_evar y] ∪ {[fresh_evar phi^{evar:S dbi↦x}]} ∪ {[x]} ∪ {[y]})) ≠ fresh_evar phi^{evar:S dbi↦x}
HyBx: evar_fresh (elements (free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦ patt_free_evar y] ∪ {[fresh_evar phi^{evar:S dbi↦x}]} ∪ {[x]} ∪ {[y]})) ≠ x

free_evars phi^{evar:S dbi↦x} ⊆ free_evars phi ∪ free_evars phi^{evar:S dbi↦x}
apply union_subseteq_r.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
phi': Pattern
Heqphi': phi' = phi^{evar:S dbi↦x}
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi'
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi' ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi' ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi'

eval (update_evar_val x' c ρ) phi^{evar:0↦x'}^[evar:Init.Nat.pred (S dbi)↦patt_free_evar y] = eval (update_evar_val Xfr' c (update_evar_val x (evar_valuation ρ y) ρ)) phi'^{evar:0↦Xfr'}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
phi': Pattern
Heqphi': phi' = phi^{evar:S dbi↦x}
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi'
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi' ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi' ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi'

evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
phi': Pattern
Heqphi': phi' = phi^{evar:S dbi↦x}
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi'
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi' ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi' ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi'
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]
eval (update_evar_val x' c ρ) phi^{evar:0↦x'}^[evar: Init.Nat.pred (S dbi)↦ patt_free_evar y] = eval (update_evar_val Xfr' c (update_evar_val x (evar_valuation ρ y) ρ)) phi'^{evar:0↦Xfr'}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
phi': Pattern
Heqphi': phi' = phi^{evar:S dbi↦x}
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi'
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi' ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi' ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi'

evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
HyBfphi': evar_is_fresh_in (evar_fresh (elements (free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar: S dbi↦patt_free_evar y] ∪ {[fresh_evar phi^{evar:S dbi↦x}]} ∪ {[x]} ∪ {[y]}))) phi^{evar:S dbi↦x}
HyBfphi: evar_is_fresh_in (evar_fresh (elements (free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar: S dbi↦patt_free_evar y] ∪ {[fresh_evar phi^{evar:S dbi↦x}]} ∪ {[x]} ∪ {[y]}))) phi
HyBy: evar_fresh (elements (free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦ patt_free_evar y] ∪ {[fresh_evar phi^{evar:S dbi↦x}]} ∪ {[x]} ∪ {[y]})) ≠ y
HyBXfr': evar_fresh (elements (free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦ patt_free_evar y] ∪ {[fresh_evar phi^{evar:S dbi↦x}]} ∪ {[x]} ∪ {[y]})) ≠ fresh_evar phi^{evar:S dbi↦x}
HyBx: evar_fresh (elements (free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦ patt_free_evar y] ∪ {[fresh_evar phi^{evar:S dbi↦x}]} ∪ {[x]} ∪ {[y]})) ≠ x

evar_is_fresh_in (evar_fresh (elements (free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[fresh_evar phi^{evar:S dbi↦x}]} ∪ {[x]} ∪ {[y]}))) phi^[evar:S dbi↦patt_free_evar y]
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
HyBfphi': evar_is_fresh_in (evar_fresh (elements (free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar: S dbi↦patt_free_evar y] ∪ {[fresh_evar phi^{evar:S dbi↦x}]} ∪ {[x]} ∪ {[y]}))) phi^{evar:S dbi↦x}
HyBfphi: evar_is_fresh_in (evar_fresh (elements (free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar: S dbi↦patt_free_evar y] ∪ {[fresh_evar phi^{evar:S dbi↦x}]} ∪ {[x]} ∪ {[y]}))) phi
HyBy: evar_fresh (elements (free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦ patt_free_evar y] ∪ {[fresh_evar phi^{evar:S dbi↦x}]} ∪ {[x]} ∪ {[y]})) ≠ y
HyBXfr': evar_fresh (elements (free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦ patt_free_evar y] ∪ {[fresh_evar phi^{evar:S dbi↦x}]} ∪ {[x]} ∪ {[y]})) ≠ fresh_evar phi^{evar:S dbi↦x}
HyBx: evar_fresh (elements (free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦ patt_free_evar y] ∪ {[fresh_evar phi^{evar:S dbi↦x}]} ∪ {[x]} ∪ {[y]})) ≠ x

free_evars phi^[evar:S dbi↦patt_free_evar y] ⊆ ?B
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
HyBfphi': evar_is_fresh_in (evar_fresh (elements (free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar: S dbi↦patt_free_evar y] ∪ {[fresh_evar phi^{evar:S dbi↦x}]} ∪ {[x]} ∪ {[y]}))) phi^{evar:S dbi↦x}
HyBfphi: evar_is_fresh_in (evar_fresh (elements (free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar: S dbi↦patt_free_evar y] ∪ {[fresh_evar phi^{evar:S dbi↦x}]} ∪ {[x]} ∪ {[y]}))) phi
HyBy: evar_fresh (elements (free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦ patt_free_evar y] ∪ {[fresh_evar phi^{evar:S dbi↦x}]} ∪ {[x]} ∪ {[y]})) ≠ y
HyBXfr': evar_fresh (elements (free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦ patt_free_evar y] ∪ {[fresh_evar phi^{evar:S dbi↦x}]} ∪ {[x]} ∪ {[y]})) ≠ fresh_evar phi^{evar:S dbi↦x}
HyBx: evar_fresh (elements (free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦ patt_free_evar y] ∪ {[fresh_evar phi^{evar:S dbi↦x}]} ∪ {[x]} ∪ {[y]})) ≠ x
evar_fresh (elements (free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[fresh_evar phi^{evar:S dbi↦x}]} ∪ {[x]} ∪ {[y]})) ∉ ?B
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
HyBfphi': evar_is_fresh_in (evar_fresh (elements (free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar: S dbi↦patt_free_evar y] ∪ {[fresh_evar phi^{evar:S dbi↦x}]} ∪ {[x]} ∪ {[y]}))) phi^{evar:S dbi↦x}
HyBfphi: evar_is_fresh_in (evar_fresh (elements (free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar: S dbi↦patt_free_evar y] ∪ {[fresh_evar phi^{evar:S dbi↦x}]} ∪ {[x]} ∪ {[y]}))) phi
HyBy: evar_fresh (elements (free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦ patt_free_evar y] ∪ {[fresh_evar phi^{evar:S dbi↦x}]} ∪ {[x]} ∪ {[y]})) ≠ y
HyBXfr': evar_fresh (elements (free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦ patt_free_evar y] ∪ {[fresh_evar phi^{evar:S dbi↦x}]} ∪ {[x]} ∪ {[y]})) ≠ fresh_evar phi^{evar:S dbi↦x}
HyBx: evar_fresh (elements (free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦ patt_free_evar y] ∪ {[fresh_evar phi^{evar:S dbi↦x}]} ∪ {[x]} ∪ {[y]})) ≠ x

free_evars phi^[evar:S dbi↦patt_free_evar y] ⊆ free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[fresh_evar phi^{evar:S dbi↦x}]} ∪ {[x]} ∪ {[y]}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
HyBfphi': evar_is_fresh_in (evar_fresh (elements (free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar: S dbi↦patt_free_evar y] ∪ {[fresh_evar phi^{evar:S dbi↦x}]} ∪ {[x]} ∪ {[y]}))) phi^{evar:S dbi↦x}
HyBfphi: evar_is_fresh_in (evar_fresh (elements (free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar: S dbi↦patt_free_evar y] ∪ {[fresh_evar phi^{evar:S dbi↦x}]} ∪ {[x]} ∪ {[y]}))) phi
HyBy: evar_fresh (elements (free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦ patt_free_evar y] ∪ {[fresh_evar phi^{evar:S dbi↦x}]} ∪ {[x]} ∪ {[y]})) ≠ y
HyBXfr': evar_fresh (elements (free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦ patt_free_evar y] ∪ {[fresh_evar phi^{evar:S dbi↦x}]} ∪ {[x]} ∪ {[y]})) ≠ fresh_evar phi^{evar:S dbi↦x}
HyBx: evar_fresh (elements (free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦ patt_free_evar y] ∪ {[fresh_evar phi^{evar:S dbi↦x}]} ∪ {[x]} ∪ {[y]})) ≠ x

free_evars phi^[evar:S dbi↦patt_free_evar y] ⊆ free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦patt_free_evar y]
apply union_subseteq_r.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
phi': Pattern
Heqphi': phi' = phi^{evar:S dbi↦x}
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi'
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi' ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi' ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi'
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]

eval (update_evar_val x' c ρ) phi^{evar:0↦x'}^[evar:Init.Nat.pred (S dbi)↦patt_free_evar y] = eval (update_evar_val Xfr' c (update_evar_val x (evar_valuation ρ y) ρ)) phi'^{evar:0↦Xfr'}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
phi': Pattern
Heqphi': phi' = phi^{evar:S dbi↦x}
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi'
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi' ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi' ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi'
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]

eval (update_evar_val x' c ρ) phi^{evar:0↦x'}^[evar:Init.Nat.pred (S dbi)↦patt_free_evar y] = eval (update_evar_val yB c (update_evar_val x (evar_valuation ρ y) ρ)) phi'^{evar:0↦yB}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
phi': Pattern
Heqphi': phi' = phi^{evar:S dbi↦x}
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi'
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi' ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi' ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi'
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]
evar_is_fresh_in Xfr' phi'
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
phi': Pattern
Heqphi': phi' = phi^{evar:S dbi↦x}
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi'
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi' ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi' ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi'
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]
evar_is_fresh_in yB phi'
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
phi': Pattern
Heqphi': phi' = phi^{evar:S dbi↦x}
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi'
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi' ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi' ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi'
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]

evar_is_fresh_in yB phi'
apply HyBfphi'.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
phi': Pattern
Heqphi': phi' = phi^{evar:S dbi↦x}
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi'
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi' ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi' ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi'
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]

eval (update_evar_val x' c ρ) phi^{evar:0↦x'}^[evar:Init.Nat.pred (S dbi)↦patt_free_evar y] = eval (update_evar_val yB c (update_evar_val x (evar_valuation ρ y) ρ)) phi'^{evar:0↦yB}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
phi': Pattern
Heqphi': phi' = phi^{evar:S dbi↦x}
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi'
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi' ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi' ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi'
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]
evar_is_fresh_in Xfr' phi'
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
phi': Pattern
Heqphi': phi' = phi^{evar:S dbi↦x}
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi'
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi' ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi' ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi'
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]

evar_is_fresh_in Xfr' phi'
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
HyBfbevar_open: evar_is_fresh_in (evar_fresh (elements (free_evars phi ∪ free_evars phi^{evar: S dbi↦x} ∪ free_evars phi^[evar: S dbi↦patt_free_evar y] ∪ {[fresh_evar phi^{evar: S dbi↦x}]} ∪ {[x]} ∪ {[y]}))) phi^[evar:S dbi↦patt_free_evar y]
HyBfphi': evar_is_fresh_in (evar_fresh (elements (free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar: S dbi↦patt_free_evar y] ∪ {[fresh_evar phi^{evar:S dbi↦x}]} ∪ {[x]} ∪ {[y]}))) phi^{evar:S dbi↦x}
HyBfphi: evar_is_fresh_in (evar_fresh (elements (free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar: S dbi↦patt_free_evar y] ∪ {[fresh_evar phi^{evar:S dbi↦x}]} ∪ {[x]} ∪ {[y]}))) phi
HyBy: evar_fresh (elements (free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦ patt_free_evar y] ∪ {[fresh_evar phi^{evar:S dbi↦x}]} ∪ {[x]} ∪ {[y]})) ≠ y
HyBXfr': evar_fresh (elements (free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦ patt_free_evar y] ∪ {[fresh_evar phi^{evar:S dbi↦x}]} ∪ {[x]} ∪ {[y]})) ≠ fresh_evar phi^{evar:S dbi↦x}
HyBx: evar_fresh (elements (free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦ patt_free_evar y] ∪ {[fresh_evar phi^{evar:S dbi↦x}]} ∪ {[x]} ∪ {[y]})) ≠ x

evar_is_fresh_in (fresh_evar phi^{evar:S dbi↦x}) phi^{evar:S dbi↦x}
apply set_evar_fresh_is_fresh.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
phi': Pattern
Heqphi': phi' = phi^{evar:S dbi↦x}
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi'
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi' ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi' ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi'
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]

eval (update_evar_val x' c ρ) phi^{evar:0↦x'}^[evar:Init.Nat.pred (S dbi)↦patt_free_evar y] = eval (update_evar_val yB c (update_evar_val x (evar_valuation ρ y) ρ)) phi'^{evar:0↦yB}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
phi': Pattern
Heqphi': phi' = phi^{evar:S dbi↦x}
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi'
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi' ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi' ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi'
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]

yB ≠ x
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
phi': Pattern
Heqphi': phi' = phi^{evar:S dbi↦x}
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi'
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi' ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi' ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi'
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]
eval (update_evar_val x' c ρ) phi^{evar:0↦x'}^[evar: Init.Nat.pred (S dbi)↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) (update_evar_val yB c ρ)) phi'^{evar:0↦yB}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
phi': Pattern
Heqphi': phi' = phi^{evar:S dbi↦x}
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi'
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi' ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi' ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi'
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]

yB ≠ x
apply HyBx.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
phi': Pattern
Heqphi': phi' = phi^{evar:S dbi↦x}
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi'
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi' ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi' ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi'
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]

eval (update_evar_val x' c ρ) phi^{evar:0↦x'}^[evar:Init.Nat.pred (S dbi)↦patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) (update_evar_val yB c ρ)) phi'^{evar:0↦yB}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi^{evar:S dbi↦x}
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi^{evar:S dbi↦x} ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi^{evar:S dbi↦x}
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]

eval (update_evar_val x' c ρ) phi^{evar:0↦x'}^[evar:Init.Nat.pred (S dbi)↦patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) (update_evar_val yB c ρ)) phi^{evar:S dbi↦x}^{evar:0↦yB}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi^{evar:S dbi↦x}
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi^{evar:S dbi↦x} ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi^{evar:S dbi↦x}
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]

0 < S dbi
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi^{evar:S dbi↦x}
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi^{evar:S dbi↦x} ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi^{evar:S dbi↦x}
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]
eval (update_evar_val x' c ρ) phi^{evar:0↦x'}^[evar: Init.Nat.pred (S dbi)↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) (update_evar_val yB c ρ)) phi^{evar:0↦yB}^{evar: Init.Nat.pred (S dbi)↦x}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi^{evar:S dbi↦x}
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi^{evar:S dbi↦x} ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi^{evar:S dbi↦x}
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]

0 < S dbi
lia.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi^{evar:S dbi↦x}
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi^{evar:S dbi↦x} ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi^{evar:S dbi↦x}
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]

eval (update_evar_val x' c ρ) phi^{evar:0↦x'}^[evar:Init.Nat.pred (S dbi)↦patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) (update_evar_val yB c ρ)) phi^{evar:0↦yB}^{evar:Init.Nat.pred (S dbi)↦x}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi^{evar:S dbi↦x}
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi^{evar:S dbi↦x} ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi^{evar:S dbi↦x}
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]
ρ': Valuation
Heqρ': ρ' = update_evar_val yB c ρ

eval (update_evar_val x' c ρ) phi^{evar:0↦x'}^[evar:Init.Nat.pred (S dbi)↦patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ') phi^{evar:0↦yB}^{evar:Init.Nat.pred (S dbi)↦x}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi^{evar:S dbi↦x}
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi^{evar:S dbi↦x} ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi^{evar:S dbi↦x}
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]
ρ': Valuation
Heqρ': ρ' = update_evar_val yB c ρ
phi': Pattern
Heqphi': phi' = phi^{evar:0↦yB}^{evar:S dbi↦x}

eval (update_evar_val x' c ρ) phi^{evar:0↦x'}^[evar:Init.Nat.pred (S dbi)↦patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ') phi^{evar:0↦yB}^{evar:Init.Nat.pred (S dbi)↦x}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi^{evar:S dbi↦x}
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi^{evar:S dbi↦x} ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi^{evar:S dbi↦x}
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]
ρ': Valuation
Heqρ': ρ' = update_evar_val yB c ρ

eval (update_evar_val x' c ρ) phi^{evar:0↦x'}^[evar:Init.Nat.pred (S dbi)↦patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ') phi^{evar:0↦yB}^{evar:Init.Nat.pred (S dbi)↦x}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi^{evar:S dbi↦x}
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi^{evar:S dbi↦x} ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi^{evar:S dbi↦x}
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]
ρ': Valuation
Heqρ': ρ' = update_evar_val yB c ρ

evar_valuation ρ y = evar_valuation ρ' y
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi^{evar:S dbi↦x}
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi^{evar:S dbi↦x} ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi^{evar:S dbi↦x}
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]
ρ': Valuation
Heqρ': ρ' = update_evar_val yB c ρ
Hevar_val: evar_valuation ρ y = evar_valuation ρ' y
eval (update_evar_val x' c ρ) phi^{evar:0↦x'}^[evar: Init.Nat.pred (S dbi)↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ') phi^{evar:0↦yB}^{evar: Init.Nat.pred (S dbi)↦x}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi^{evar:S dbi↦x}
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi^{evar:S dbi↦x} ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi^{evar:S dbi↦x}
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]
ρ': Valuation
Heqρ': ρ' = update_evar_val yB c ρ

evar_valuation ρ y = evar_valuation ρ' y
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi^{evar:S dbi↦x}
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi^{evar:S dbi↦x} ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi^{evar:S dbi↦x}
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]

evar_valuation ρ y = evar_valuation (update_evar_val yB c ρ) y
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi^{evar:S dbi↦x}
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi^{evar:S dbi↦x} ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi^{evar:S dbi↦x}
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]

yB ≠ y
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi^{evar:S dbi↦x}
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi^{evar:S dbi↦x} ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi^{evar:S dbi↦x}
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]
evar_valuation ρ y = evar_valuation ρ y
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi^{evar:S dbi↦x}
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi^{evar:S dbi↦x} ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi^{evar:S dbi↦x}
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]

evar_valuation ρ y = evar_valuation ρ y
reflexivity.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi^{evar:S dbi↦x}
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi^{evar:S dbi↦x} ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi^{evar:S dbi↦x}
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]
ρ': Valuation
Heqρ': ρ' = update_evar_val yB c ρ
Hevar_val: evar_valuation ρ y = evar_valuation ρ' y

eval (update_evar_val x' c ρ) phi^{evar:0↦x'}^[evar:Init.Nat.pred (S dbi)↦patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ') phi^{evar:0↦yB}^{evar:Init.Nat.pred (S dbi)↦x}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi^{evar:S dbi↦x}
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi^{evar:S dbi↦x} ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi^{evar:S dbi↦x}
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]
ρ': Valuation
Heqρ': ρ' = update_evar_val yB c ρ
Hevar_val: evar_valuation ρ y = evar_valuation ρ' y

eval (update_evar_val x' c ρ) phi^{evar:0↦x'}^[evar:Init.Nat.pred (S dbi)↦patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ' y) ρ') phi^{evar:0↦yB}^{evar:Init.Nat.pred (S dbi)↦x}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi^{evar:S dbi↦x}
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi^{evar:S dbi↦x} ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi^{evar:S dbi↦x}
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]
ρ': Valuation
Heqρ': ρ' = update_evar_val yB c ρ
Hevar_val: evar_valuation ρ y = evar_valuation ρ' y

eval (update_evar_val x' c ρ) phi^{evar:0↦x'}^[evar:Init.Nat.pred (S dbi)↦patt_free_evar y] = eval ρ' phi^{evar:0↦yB}^[evar:Init.Nat.pred (S dbi)↦patt_free_evar y]
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi^{evar:S dbi↦x}
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi^{evar:S dbi↦x} ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi^{evar:S dbi↦x}
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]
ρ': Valuation
Heqρ': ρ' = update_evar_val yB c ρ
Hevar_val: evar_valuation ρ y = evar_valuation ρ' y
size phi^{evar:0↦yB} ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi^{evar:S dbi↦x}
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi^{evar:S dbi↦x} ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi^{evar:S dbi↦x}
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]
ρ': Valuation
Heqρ': ρ' = update_evar_val yB c ρ
Hevar_val: evar_valuation ρ y = evar_valuation ρ' y
evar_is_fresh_in x phi^{evar:0↦yB}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi^{evar:S dbi↦x}
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi^{evar:S dbi↦x} ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi^{evar:S dbi↦x}
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]
ρ': Valuation
Heqρ': ρ' = update_evar_val yB c ρ
Hevar_val: evar_valuation ρ y = evar_valuation ρ' y
well_formed_closed_ex_aux phi^{evar:0↦yB} (S (Init.Nat.pred (S dbi)))
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi^{evar:S dbi↦x}
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi^{evar:S dbi↦x} ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi^{evar:S dbi↦x}
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]
Hevar_val: evar_valuation ρ y = evar_valuation (update_evar_val yB c ρ) y

eval (update_evar_val x' c ρ) phi^{evar:0↦x'}^[evar:Init.Nat.pred (S dbi)↦patt_free_evar y] = eval (update_evar_val yB c ρ) phi^{evar:0↦yB}^[evar:Init.Nat.pred (S dbi)↦patt_free_evar y]
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi^{evar:S dbi↦x}
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi^{evar:S dbi↦x} ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi^{evar:S dbi↦x}
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]
ρ': Valuation
Heqρ': ρ' = update_evar_val yB c ρ
Hevar_val: evar_valuation ρ y = evar_valuation ρ' y
size phi^{evar:0↦yB} ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi^{evar:S dbi↦x}
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi^{evar:S dbi↦x} ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi^{evar:S dbi↦x}
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]
ρ': Valuation
Heqρ': ρ' = update_evar_val yB c ρ
Hevar_val: evar_valuation ρ y = evar_valuation ρ' y
evar_is_fresh_in x phi^{evar:0↦yB}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi^{evar:S dbi↦x}
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi^{evar:S dbi↦x} ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi^{evar:S dbi↦x}
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]
ρ': Valuation
Heqρ': ρ' = update_evar_val yB c ρ
Hevar_val: evar_valuation ρ y = evar_valuation ρ' y
well_formed_closed_ex_aux phi^{evar:0↦yB} (S (Init.Nat.pred (S dbi)))
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi^{evar:S dbi↦x}
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi^{evar:S dbi↦x} ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi^{evar:S dbi↦x}
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]
Hevar_val: evar_valuation ρ y = evar_valuation (update_evar_val yB c ρ) y

eval (update_evar_val x' c ρ) phi^[evar:S dbi↦patt_free_evar y]^{evar:0↦x'} = eval (update_evar_val yB c ρ) phi^{evar:0↦yB}^[evar:Init.Nat.pred (S dbi)↦patt_free_evar y]
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi^{evar:S dbi↦x}
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi^{evar:S dbi↦x} ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi^{evar:S dbi↦x}
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]
Hevar_val: evar_valuation ρ y = evar_valuation (update_evar_val yB c ρ) y
well_formed_closed_ex_aux (patt_free_evar y) 0
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi^{evar:S dbi↦x}
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi^{evar:S dbi↦x} ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi^{evar:S dbi↦x}
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]
Hevar_val: evar_valuation ρ y = evar_valuation (update_evar_val yB c ρ) y
0 < S dbi
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi^{evar:S dbi↦x}
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi^{evar:S dbi↦x} ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi^{evar:S dbi↦x}
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]
ρ': Valuation
Heqρ': ρ' = update_evar_val yB c ρ
Hevar_val: evar_valuation ρ y = evar_valuation ρ' y
size phi^{evar:0↦yB} ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi^{evar:S dbi↦x}
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi^{evar:S dbi↦x} ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi^{evar:S dbi↦x}
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]
ρ': Valuation
Heqρ': ρ' = update_evar_val yB c ρ
Hevar_val: evar_valuation ρ y = evar_valuation ρ' y
evar_is_fresh_in x phi^{evar:0↦yB}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi^{evar:S dbi↦x}
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi^{evar:S dbi↦x} ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi^{evar:S dbi↦x}
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]
ρ': Valuation
Heqρ': ρ' = update_evar_val yB c ρ
Hevar_val: evar_valuation ρ y = evar_valuation ρ' y
well_formed_closed_ex_aux phi^{evar:0↦yB} (S (Init.Nat.pred (S dbi)))
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi^{evar:S dbi↦x}
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi^{evar:S dbi↦x} ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi^{evar:S dbi↦x}
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]
Hevar_val: evar_valuation ρ y = evar_valuation (update_evar_val yB c ρ) y

eval (update_evar_val x' c ρ) phi^[evar:S dbi↦patt_free_evar y]^{evar:0↦x'} = eval (update_evar_val yB c ρ) phi^[evar:S dbi↦patt_free_evar y]^{evar:0↦yB}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi^{evar:S dbi↦x}
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi^{evar:S dbi↦x} ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi^{evar:S dbi↦x}
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]
Hevar_val: evar_valuation ρ y = evar_valuation (update_evar_val yB c ρ) y
well_formed_closed_ex_aux (patt_free_evar y) 0
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi^{evar:S dbi↦x}
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi^{evar:S dbi↦x} ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi^{evar:S dbi↦x}
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]
Hevar_val: evar_valuation ρ y = evar_valuation (update_evar_val yB c ρ) y
0 < S dbi
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi^{evar:S dbi↦x}
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi^{evar:S dbi↦x} ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi^{evar:S dbi↦x}
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]
Hevar_val: evar_valuation ρ y = evar_valuation (update_evar_val yB c ρ) y
well_formed_closed_ex_aux (patt_free_evar y) 0
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi^{evar:S dbi↦x}
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi^{evar:S dbi↦x} ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi^{evar:S dbi↦x}
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]
Hevar_val: evar_valuation ρ y = evar_valuation (update_evar_val yB c ρ) y
0 < S dbi
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi^{evar:S dbi↦x}
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi^{evar:S dbi↦x} ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi^{evar:S dbi↦x}
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]
ρ': Valuation
Heqρ': ρ' = update_evar_val yB c ρ
Hevar_val: evar_valuation ρ y = evar_valuation ρ' y
size phi^{evar:0↦yB} ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi^{evar:S dbi↦x}
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi^{evar:S dbi↦x} ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi^{evar:S dbi↦x}
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]
ρ': Valuation
Heqρ': ρ' = update_evar_val yB c ρ
Hevar_val: evar_valuation ρ y = evar_valuation ρ' y
evar_is_fresh_in x phi^{evar:0↦yB}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi^{evar:S dbi↦x}
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi^{evar:S dbi↦x} ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi^{evar:S dbi↦x}
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]
ρ': Valuation
Heqρ': ρ' = update_evar_val yB c ρ
Hevar_val: evar_valuation ρ y = evar_valuation ρ' y
well_formed_closed_ex_aux phi^{evar:0↦yB} (S (Init.Nat.pred (S dbi)))
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi^{evar:S dbi↦x}
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi^{evar:S dbi↦x} ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi^{evar:S dbi↦x}
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]
Hevar_val: evar_valuation ρ y = evar_valuation (update_evar_val yB c ρ) y

eval (update_evar_val yB c ρ) phi^[evar:S dbi↦patt_free_evar y]^{evar:0↦yB} = eval (update_evar_val yB c ρ) phi^[evar:S dbi↦patt_free_evar y]^{evar:0↦yB}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi^{evar:S dbi↦x}
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi^{evar:S dbi↦x} ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi^{evar:S dbi↦x}
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]
Hevar_val: evar_valuation ρ y = evar_valuation (update_evar_val yB c ρ) y
evar_is_fresh_in x' phi^[evar:S dbi↦patt_free_evar y]
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi^{evar:S dbi↦x}
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi^{evar:S dbi↦x} ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi^{evar:S dbi↦x}
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]
Hevar_val: evar_valuation ρ y = evar_valuation (update_evar_val yB c ρ) y
evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi^{evar:S dbi↦x}
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi^{evar:S dbi↦x} ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi^{evar:S dbi↦x}
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]
Hevar_val: evar_valuation ρ y = evar_valuation (update_evar_val yB c ρ) y
well_formed_closed_ex_aux (patt_free_evar y) 0
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi^{evar:S dbi↦x}
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi^{evar:S dbi↦x} ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi^{evar:S dbi↦x}
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]
Hevar_val: evar_valuation ρ y = evar_valuation (update_evar_val yB c ρ) y
0 < S dbi
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi^{evar:S dbi↦x}
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi^{evar:S dbi↦x} ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi^{evar:S dbi↦x}
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]
Hevar_val: evar_valuation ρ y = evar_valuation (update_evar_val yB c ρ) y
well_formed_closed_ex_aux (patt_free_evar y) 0
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi^{evar:S dbi↦x}
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi^{evar:S dbi↦x} ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi^{evar:S dbi↦x}
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]
Hevar_val: evar_valuation ρ y = evar_valuation (update_evar_val yB c ρ) y
0 < S dbi
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi^{evar:S dbi↦x}
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi^{evar:S dbi↦x} ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi^{evar:S dbi↦x}
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]
ρ': Valuation
Heqρ': ρ' = update_evar_val yB c ρ
Hevar_val: evar_valuation ρ y = evar_valuation ρ' y
size phi^{evar:0↦yB} ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi^{evar:S dbi↦x}
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi^{evar:S dbi↦x} ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi^{evar:S dbi↦x}
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]
ρ': Valuation
Heqρ': ρ' = update_evar_val yB c ρ
Hevar_val: evar_valuation ρ y = evar_valuation ρ' y
evar_is_fresh_in x phi^{evar:0↦yB}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi^{evar:S dbi↦x}
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi^{evar:S dbi↦x} ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi^{evar:S dbi↦x}
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]
ρ': Valuation
Heqρ': ρ' = update_evar_val yB c ρ
Hevar_val: evar_valuation ρ y = evar_valuation ρ' y
well_formed_closed_ex_aux phi^{evar:0↦yB} (S (Init.Nat.pred (S dbi)))
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi^{evar:S dbi↦x}
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi^{evar:S dbi↦x} ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi^{evar:S dbi↦x}
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]
Hevar_val: evar_valuation ρ y = evar_valuation (update_evar_val yB c ρ) y

evar_is_fresh_in x' phi^[evar:S dbi↦patt_free_evar y]
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi^{evar:S dbi↦x}
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi^{evar:S dbi↦x} ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi^{evar:S dbi↦x}
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]
Hevar_val: evar_valuation ρ y = evar_valuation (update_evar_val yB c ρ) y
evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi^{evar:S dbi↦x}
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi^{evar:S dbi↦x} ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi^{evar:S dbi↦x}
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]
Hevar_val: evar_valuation ρ y = evar_valuation (update_evar_val yB c ρ) y
well_formed_closed_ex_aux (patt_free_evar y) 0
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi^{evar:S dbi↦x}
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi^{evar:S dbi↦x} ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi^{evar:S dbi↦x}
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]
Hevar_val: evar_valuation ρ y = evar_valuation (update_evar_val yB c ρ) y
0 < S dbi
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi^{evar:S dbi↦x}
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi^{evar:S dbi↦x} ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi^{evar:S dbi↦x}
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]
Hevar_val: evar_valuation ρ y = evar_valuation (update_evar_val yB c ρ) y
well_formed_closed_ex_aux (patt_free_evar y) 0
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi^{evar:S dbi↦x}
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi^{evar:S dbi↦x} ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi^{evar:S dbi↦x}
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]
Hevar_val: evar_valuation ρ y = evar_valuation (update_evar_val yB c ρ) y
0 < S dbi
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi^{evar:S dbi↦x}
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi^{evar:S dbi↦x} ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi^{evar:S dbi↦x}
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]
ρ': Valuation
Heqρ': ρ' = update_evar_val yB c ρ
Hevar_val: evar_valuation ρ y = evar_valuation ρ' y
size phi^{evar:0↦yB} ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi^{evar:S dbi↦x}
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi^{evar:S dbi↦x} ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi^{evar:S dbi↦x}
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]
ρ': Valuation
Heqρ': ρ' = update_evar_val yB c ρ
Hevar_val: evar_valuation ρ y = evar_valuation ρ' y
evar_is_fresh_in x phi^{evar:0↦yB}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi^{evar:S dbi↦x}
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi^{evar:S dbi↦x} ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi^{evar:S dbi↦x}
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]
ρ': Valuation
Heqρ': ρ' = update_evar_val yB c ρ
Hevar_val: evar_valuation ρ y = evar_valuation ρ' y
well_formed_closed_ex_aux phi^{evar:0↦yB} (S (Init.Nat.pred (S dbi)))
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi^{evar:S dbi↦x}
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi^{evar:S dbi↦x} ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi^{evar:S dbi↦x}
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]
Hevar_val: evar_valuation ρ y = evar_valuation (update_evar_val yB c ρ) y

evar_is_fresh_in x' phi^[evar:S dbi↦patt_free_evar y]
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi^{evar:S dbi↦x}
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi^{evar:S dbi↦x} ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi^{evar:S dbi↦x}
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]
Hevar_val: evar_valuation ρ y = evar_valuation (update_evar_val yB c ρ) y

evar_is_fresh_in (fresh_evar phi^[evar:S dbi↦patt_free_evar y]) phi^[evar:S dbi↦patt_free_evar y]
apply set_evar_fresh_is_fresh.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi^{evar:S dbi↦x}
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi^{evar:S dbi↦x} ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi^{evar:S dbi↦x}
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]
Hevar_val: evar_valuation ρ y = evar_valuation (update_evar_val yB c ρ) y

evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi^{evar:S dbi↦x}
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi^{evar:S dbi↦x} ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi^{evar:S dbi↦x}
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]
Hevar_val: evar_valuation ρ y = evar_valuation (update_evar_val yB c ρ) y
well_formed_closed_ex_aux (patt_free_evar y) 0
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi^{evar:S dbi↦x}
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi^{evar:S dbi↦x} ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi^{evar:S dbi↦x}
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]
Hevar_val: evar_valuation ρ y = evar_valuation (update_evar_val yB c ρ) y
0 < S dbi
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi^{evar:S dbi↦x}
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi^{evar:S dbi↦x} ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi^{evar:S dbi↦x}
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]
Hevar_val: evar_valuation ρ y = evar_valuation (update_evar_val yB c ρ) y
well_formed_closed_ex_aux (patt_free_evar y) 0
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi^{evar:S dbi↦x}
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi^{evar:S dbi↦x} ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi^{evar:S dbi↦x}
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]
Hevar_val: evar_valuation ρ y = evar_valuation (update_evar_val yB c ρ) y
0 < S dbi
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi^{evar:S dbi↦x}
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi^{evar:S dbi↦x} ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi^{evar:S dbi↦x}
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]
ρ': Valuation
Heqρ': ρ' = update_evar_val yB c ρ
Hevar_val: evar_valuation ρ y = evar_valuation ρ' y
size phi^{evar:0↦yB} ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi^{evar:S dbi↦x}
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi^{evar:S dbi↦x} ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi^{evar:S dbi↦x}
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]
ρ': Valuation
Heqρ': ρ' = update_evar_val yB c ρ
Hevar_val: evar_valuation ρ y = evar_valuation ρ' y
evar_is_fresh_in x phi^{evar:0↦yB}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi^{evar:S dbi↦x}
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi^{evar:S dbi↦x} ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi^{evar:S dbi↦x}
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]
ρ': Valuation
Heqρ': ρ' = update_evar_val yB c ρ
Hevar_val: evar_valuation ρ y = evar_valuation ρ' y
well_formed_closed_ex_aux phi^{evar:0↦yB} (S (Init.Nat.pred (S dbi)))
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi^{evar:S dbi↦x}
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi^{evar:S dbi↦x} ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi^{evar:S dbi↦x}
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]
Hevar_val: evar_valuation ρ y = evar_valuation (update_evar_val yB c ρ) y

evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]
apply HyBfbevar_open.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi^{evar:S dbi↦x}
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi^{evar:S dbi↦x} ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi^{evar:S dbi↦x}
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]
Hevar_val: evar_valuation ρ y = evar_valuation (update_evar_val yB c ρ) y

well_formed_closed_ex_aux (patt_free_evar y) 0
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi^{evar:S dbi↦x}
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi^{evar:S dbi↦x} ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi^{evar:S dbi↦x}
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]
Hevar_val: evar_valuation ρ y = evar_valuation (update_evar_val yB c ρ) y
0 < S dbi
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi^{evar:S dbi↦x}
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi^{evar:S dbi↦x} ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi^{evar:S dbi↦x}
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]
Hevar_val: evar_valuation ρ y = evar_valuation (update_evar_val yB c ρ) y
well_formed_closed_ex_aux (patt_free_evar y) 0
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi^{evar:S dbi↦x}
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi^{evar:S dbi↦x} ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi^{evar:S dbi↦x}
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]
Hevar_val: evar_valuation ρ y = evar_valuation (update_evar_val yB c ρ) y
0 < S dbi
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi^{evar:S dbi↦x}
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi^{evar:S dbi↦x} ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi^{evar:S dbi↦x}
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]
ρ': Valuation
Heqρ': ρ' = update_evar_val yB c ρ
Hevar_val: evar_valuation ρ y = evar_valuation ρ' y
size phi^{evar:0↦yB} ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi^{evar:S dbi↦x}
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi^{evar:S dbi↦x} ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi^{evar:S dbi↦x}
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]
ρ': Valuation
Heqρ': ρ' = update_evar_val yB c ρ
Hevar_val: evar_valuation ρ y = evar_valuation ρ' y
evar_is_fresh_in x phi^{evar:0↦yB}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi^{evar:S dbi↦x}
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi^{evar:S dbi↦x} ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi^{evar:S dbi↦x}
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]
ρ': Valuation
Heqρ': ρ' = update_evar_val yB c ρ
Hevar_val: evar_valuation ρ y = evar_valuation ρ' y
well_formed_closed_ex_aux phi^{evar:0↦yB} (S (Init.Nat.pred (S dbi)))
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi^{evar:S dbi↦x}
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi^{evar:S dbi↦x} ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi^{evar:S dbi↦x}
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]
Hevar_val: evar_valuation ρ y = evar_valuation (update_evar_val yB c ρ) y

well_formed_closed_ex_aux (patt_free_evar y) 0
auto.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi^{evar:S dbi↦x}
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi^{evar:S dbi↦x} ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi^{evar:S dbi↦x}
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]
Hevar_val: evar_valuation ρ y = evar_valuation (update_evar_val yB c ρ) y

0 < S dbi
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi^{evar:S dbi↦x}
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi^{evar:S dbi↦x} ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi^{evar:S dbi↦x}
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]
Hevar_val: evar_valuation ρ y = evar_valuation (update_evar_val yB c ρ) y
well_formed_closed_ex_aux (patt_free_evar y) 0
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi^{evar:S dbi↦x}
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi^{evar:S dbi↦x} ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi^{evar:S dbi↦x}
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]
Hevar_val: evar_valuation ρ y = evar_valuation (update_evar_val yB c ρ) y
0 < S dbi
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi^{evar:S dbi↦x}
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi^{evar:S dbi↦x} ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi^{evar:S dbi↦x}
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]
ρ': Valuation
Heqρ': ρ' = update_evar_val yB c ρ
Hevar_val: evar_valuation ρ y = evar_valuation ρ' y
size phi^{evar:0↦yB} ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi^{evar:S dbi↦x}
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi^{evar:S dbi↦x} ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi^{evar:S dbi↦x}
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]
ρ': Valuation
Heqρ': ρ' = update_evar_val yB c ρ
Hevar_val: evar_valuation ρ y = evar_valuation ρ' y
evar_is_fresh_in x phi^{evar:0↦yB}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi^{evar:S dbi↦x}
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi^{evar:S dbi↦x} ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi^{evar:S dbi↦x}
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]
ρ': Valuation
Heqρ': ρ' = update_evar_val yB c ρ
Hevar_val: evar_valuation ρ y = evar_valuation ρ' y
well_formed_closed_ex_aux phi^{evar:0↦yB} (S (Init.Nat.pred (S dbi)))
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi^{evar:S dbi↦x}
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi^{evar:S dbi↦x} ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi^{evar:S dbi↦x}
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]
Hevar_val: evar_valuation ρ y = evar_valuation (update_evar_val yB c ρ) y

0 < S dbi
lia.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi^{evar:S dbi↦x}
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi^{evar:S dbi↦x} ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi^{evar:S dbi↦x}
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]
Hevar_val: evar_valuation ρ y = evar_valuation (update_evar_val yB c ρ) y

well_formed_closed_ex_aux (patt_free_evar y) 0
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi^{evar:S dbi↦x}
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi^{evar:S dbi↦x} ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi^{evar:S dbi↦x}
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]
Hevar_val: evar_valuation ρ y = evar_valuation (update_evar_val yB c ρ) y
0 < S dbi
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi^{evar:S dbi↦x}
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi^{evar:S dbi↦x} ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi^{evar:S dbi↦x}
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]
ρ': Valuation
Heqρ': ρ' = update_evar_val yB c ρ
Hevar_val: evar_valuation ρ y = evar_valuation ρ' y
size phi^{evar:0↦yB} ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi^{evar:S dbi↦x}
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi^{evar:S dbi↦x} ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi^{evar:S dbi↦x}
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]
ρ': Valuation
Heqρ': ρ' = update_evar_val yB c ρ
Hevar_val: evar_valuation ρ y = evar_valuation ρ' y
evar_is_fresh_in x phi^{evar:0↦yB}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi^{evar:S dbi↦x}
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi^{evar:S dbi↦x} ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi^{evar:S dbi↦x}
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]
ρ': Valuation
Heqρ': ρ' = update_evar_val yB c ρ
Hevar_val: evar_valuation ρ y = evar_valuation ρ' y
well_formed_closed_ex_aux phi^{evar:0↦yB} (S (Init.Nat.pred (S dbi)))
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi^{evar:S dbi↦x}
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi^{evar:S dbi↦x} ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi^{evar:S dbi↦x}
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]
Hevar_val: evar_valuation ρ y = evar_valuation (update_evar_val yB c ρ) y

well_formed_closed_ex_aux (patt_free_evar y) 0
auto.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi^{evar:S dbi↦x}
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi^{evar:S dbi↦x} ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi^{evar:S dbi↦x}
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]
Hevar_val: evar_valuation ρ y = evar_valuation (update_evar_val yB c ρ) y

0 < S dbi
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi^{evar:S dbi↦x}
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi^{evar:S dbi↦x} ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi^{evar:S dbi↦x}
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]
ρ': Valuation
Heqρ': ρ' = update_evar_val yB c ρ
Hevar_val: evar_valuation ρ y = evar_valuation ρ' y
size phi^{evar:0↦yB} ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi^{evar:S dbi↦x}
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi^{evar:S dbi↦x} ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi^{evar:S dbi↦x}
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]
ρ': Valuation
Heqρ': ρ' = update_evar_val yB c ρ
Hevar_val: evar_valuation ρ y = evar_valuation ρ' y
evar_is_fresh_in x phi^{evar:0↦yB}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi^{evar:S dbi↦x}
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi^{evar:S dbi↦x} ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi^{evar:S dbi↦x}
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]
ρ': Valuation
Heqρ': ρ' = update_evar_val yB c ρ
Hevar_val: evar_valuation ρ y = evar_valuation ρ' y
well_formed_closed_ex_aux phi^{evar:0↦yB} (S (Init.Nat.pred (S dbi)))
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi^{evar:S dbi↦x}
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi^{evar:S dbi↦x} ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi^{evar:S dbi↦x}
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]
Hevar_val: evar_valuation ρ y = evar_valuation (update_evar_val yB c ρ) y

0 < S dbi
lia.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi^{evar:S dbi↦x}
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi^{evar:S dbi↦x} ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi^{evar:S dbi↦x}
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]
ρ': Valuation
Heqρ': ρ' = update_evar_val yB c ρ
Hevar_val: evar_valuation ρ y = evar_valuation ρ' y

size phi^{evar:0↦yB} ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi^{evar:S dbi↦x}
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi^{evar:S dbi↦x} ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi^{evar:S dbi↦x}
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]
ρ': Valuation
Heqρ': ρ' = update_evar_val yB c ρ
Hevar_val: evar_valuation ρ y = evar_valuation ρ' y
evar_is_fresh_in x phi^{evar:0↦yB}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi^{evar:S dbi↦x}
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi^{evar:S dbi↦x} ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi^{evar:S dbi↦x}
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]
ρ': Valuation
Heqρ': ρ' = update_evar_val yB c ρ
Hevar_val: evar_valuation ρ y = evar_valuation ρ' y
well_formed_closed_ex_aux phi^{evar:0↦yB} (S (Init.Nat.pred (S dbi)))
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi^{evar:S dbi↦x}
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi^{evar:S dbi↦x} ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi^{evar:S dbi↦x}
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]
ρ': Valuation
Heqρ': ρ' = update_evar_val yB c ρ
Hevar_val: evar_valuation ρ y = evar_valuation ρ' y

size phi^{evar:0↦yB} ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi^{evar:S dbi↦x}
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi^{evar:S dbi↦x} ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi^{evar:S dbi↦x}
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]
ρ': Valuation
Heqρ': ρ' = update_evar_val yB c ρ
Hevar_val: evar_valuation ρ y = evar_valuation ρ' y

size phi ≤ sz
lia.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi^{evar:S dbi↦x}
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi^{evar:S dbi↦x} ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi^{evar:S dbi↦x}
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]
ρ': Valuation
Heqρ': ρ' = update_evar_val yB c ρ
Hevar_val: evar_valuation ρ y = evar_valuation ρ' y

evar_is_fresh_in x phi^{evar:0↦yB}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi^{evar:S dbi↦x}
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi^{evar:S dbi↦x} ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi^{evar:S dbi↦x}
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]
ρ': Valuation
Heqρ': ρ' = update_evar_val yB c ρ
Hevar_val: evar_valuation ρ y = evar_valuation ρ' y
well_formed_closed_ex_aux phi^{evar:0↦yB} (S (Init.Nat.pred (S dbi)))
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi^{evar:S dbi↦x}
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi^{evar:S dbi↦x} ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi^{evar:S dbi↦x}
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]
ρ': Valuation
Heqρ': ρ' = update_evar_val yB c ρ
Hevar_val: evar_valuation ρ y = evar_valuation ρ' y

evar_is_fresh_in x phi^{evar:0↦yB}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi^{evar:S dbi↦x}
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi^{evar:S dbi↦x} ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi^{evar:S dbi↦x}
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]
ρ': Valuation
Heqρ': ρ' = update_evar_val yB c ρ
Hevar_val: evar_valuation ρ y = evar_valuation ρ' y

x ≠ yB
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi^{evar:S dbi↦x}
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi^{evar:S dbi↦x} ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi^{evar:S dbi↦x}
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]
ρ': Valuation
Heqρ': ρ' = update_evar_val yB c ρ
Hevar_val: evar_valuation ρ y = evar_valuation ρ' y
evar_is_fresh_in x phi
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi^{evar:S dbi↦x}
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi^{evar:S dbi↦x} ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi^{evar:S dbi↦x}
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]
ρ': Valuation
Heqρ': ρ' = update_evar_val yB c ρ
Hevar_val: evar_valuation ρ y = evar_valuation ρ' y

yB ≠ x
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi^{evar:S dbi↦x}
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi^{evar:S dbi↦x} ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi^{evar:S dbi↦x}
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]
ρ': Valuation
Heqρ': ρ' = update_evar_val yB c ρ
Hevar_val: evar_valuation ρ y = evar_valuation ρ' y
evar_is_fresh_in x phi
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi^{evar:S dbi↦x}
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi^{evar:S dbi↦x} ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi^{evar:S dbi↦x}
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]
ρ': Valuation
Heqρ': ρ' = update_evar_val yB c ρ
Hevar_val: evar_valuation ρ y = evar_valuation ρ' y

evar_is_fresh_in x phi
apply H.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi^{evar:S dbi↦x}
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi^{evar:S dbi↦x} ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi^{evar:S dbi↦x}
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]
ρ': Valuation
Heqρ': ρ' = update_evar_val yB c ρ
Hevar_val: evar_valuation ρ y = evar_valuation ρ' y

well_formed_closed_ex_aux phi^{evar:0↦yB} (S (Init.Nat.pred (S dbi)))
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi^{evar:S dbi↦x}
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi^{evar:S dbi↦x} ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi^{evar:S dbi↦x}
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]
ρ': Valuation
Heqρ': ρ' = update_evar_val yB c ρ
Hevar_val: evar_valuation ρ y = evar_valuation ρ' y

well_formed_closed_ex_aux phi^{evar:0↦yB} (S (Init.Nat.pred (S dbi)))
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi^{evar:S dbi↦x}
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi^{evar:S dbi↦x} ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi^{evar:S dbi↦x}
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]
ρ': Valuation
Heqρ': ρ' = update_evar_val yB c ρ
Hevar_val: evar_valuation ρ y = evar_valuation ρ' y

well_formed_closed_ex_aux phi^{evar:0↦yB} (S dbi)
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: x ∉ free_evars phi
Hwf: well_formed_closed_ex_aux (ex , phi) (S dbi)
c: M
x': evar
Heqx': x' = fresh_evar phi^[evar:S dbi↦patt_free_evar y]
Xfr': evar
HeqXfr': Xfr' = fresh_evar phi^{evar:S dbi↦x}
Xu: evar
HeqXu: Xu = evar_fresh (elements (free_evars phi^{evar:S dbi↦x} ∪ {[x']}))
B: EVarSet
HeqB: B = free_evars phi ∪ free_evars phi^{evar:S dbi↦x} ∪ free_evars phi^[evar:S dbi↦patt_free_evar y] ∪ {[Xfr']} ∪ {[x]} ∪ {[y]}
yB: evar
HeqyB: yB = evar_fresh (elements B)
HyBx: yB ≠ x
HyBXfr': yB ≠ Xfr'
HyBy: yB ≠ y
HyBfphi: evar_is_fresh_in yB phi
HyBfphi': evar_is_fresh_in yB phi^{evar:S dbi↦x}
HyBfbevar_open: evar_is_fresh_in yB phi^[evar:S dbi↦patt_free_evar y]
ρ': Valuation
Heqρ': ρ' = update_evar_val yB c ρ
Hevar_val: evar_valuation ρ y = evar_valuation ρ' y

0 ≤ S dbi
lia. }
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)

eval ρ (mu , phi^[evar:dbi↦patt_free_evar y]) = eval (update_evar_val x (evar_valuation ρ y) ρ) (mu , phi)^{evar:dbi↦x}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)

eval ρ (mu , phi^[evar:dbi↦patt_free_evar y]) = eval (update_evar_val x (evar_valuation ρ y) ρ) (mu , phi^{evar:increase_mu pm_spec_data dbi↦x})
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)

eval ρ (mu , phi^[evar:dbi↦patt_free_evar y]) = eval (update_evar_val x (evar_valuation ρ y) ρ) (mu , phi^{evar:dbi↦x})
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)

(let X := fresh_svar phi^[evar:dbi↦patt_free_evar y] in LeastFixpointOf (λ S : propset M, let ρ' := update_svar_val X S ρ in eval ρ' phi^[evar:dbi↦patt_free_evar y]^{svar:0↦X})) = (let X := fresh_svar phi^{evar:dbi↦x} in LeastFixpointOf (λ S : propset M, let ρ' := update_svar_val X S (update_evar_val x (evar_valuation ρ y) ρ) in eval ρ' phi^{evar:dbi↦x}^{svar:0↦X}))
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)

LeastFixpointOf (λ S : propset M, eval (update_svar_val (fresh_svar phi^[evar:dbi↦patt_free_evar y]) S ρ) phi^[evar:dbi↦patt_free_evar y]^{svar:0↦fresh_svar phi^[evar:dbi↦ patt_free_evar y]}) = LeastFixpointOf (λ S : propset M, eval (update_svar_val (fresh_svar phi^{evar:dbi↦x}) S (update_evar_val x (evar_valuation ρ y) ρ)) phi^{evar:dbi↦x}^{svar:0↦fresh_svar phi^{evar:dbi↦x}})
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)

(λ S : propset M, eval (update_svar_val (fresh_svar phi^[evar:dbi↦patt_free_evar y]) S ρ) phi^[evar:dbi↦patt_free_evar y]^{svar:0↦fresh_svar phi^[evar:dbi↦ patt_free_evar y]}) = (λ S : propset M, eval (update_svar_val (fresh_svar phi^{evar:dbi↦x}) S (update_evar_val x (evar_valuation ρ y) ρ)) phi^{evar:dbi↦x}^{svar:0↦fresh_svar phi^{evar:dbi↦x}})
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)

x0 : propset M, eval (update_svar_val (fresh_svar phi^[evar:dbi↦patt_free_evar y]) x0 ρ) phi^[evar:dbi↦patt_free_evar y]^{svar:0↦fresh_svar phi^[evar:dbi↦ patt_free_evar y]} = eval (update_svar_val (fresh_svar phi^{evar:dbi↦x}) x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi^{evar:dbi↦x}^{svar:0↦fresh_svar phi^{evar:dbi↦x}}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M

eval (update_svar_val (fresh_svar phi^[evar:dbi↦patt_free_evar y]) x0 ρ) phi^[evar:dbi↦patt_free_evar y]^{svar:0↦fresh_svar phi^[evar:dbi↦ patt_free_evar y]} = eval (update_svar_val (fresh_svar phi^{evar:dbi↦x}) x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi^{evar:dbi↦x}^{svar:0↦fresh_svar phi^{evar:dbi↦x}}
(* fold (evar_open dbi y phi). *)
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
phi': Pattern
Heqphi': phi' = phi^{evar:dbi↦x}

eval (update_svar_val (fresh_svar phi^[evar:dbi↦patt_free_evar y]) x0 ρ) phi^[evar:dbi↦patt_free_evar y]^{svar:0↦fresh_svar phi^[evar:dbi↦ patt_free_evar y]} = eval (update_svar_val (fresh_svar phi') x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi'^{svar:0↦fresh_svar phi'}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
phi': Pattern
Heqphi': phi' = phi^{evar:dbi↦x}
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi'

eval (update_svar_val (fresh_svar phi^[evar:dbi↦patt_free_evar y]) x0 ρ) phi^[evar:dbi↦patt_free_evar y]^{svar:0↦fresh_svar phi^[evar:dbi↦ patt_free_evar y]} = eval (update_svar_val Xfr' x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi'^{svar:0↦Xfr'}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
phi': Pattern
Heqphi': phi' = phi^{evar:dbi↦x}
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi'
Xu: svar
HeqXu: Xu = svar_fresh (elements (free_svars phi'))

eval (update_svar_val (fresh_svar phi^[evar:dbi↦patt_free_evar y]) x0 ρ) phi^[evar:dbi↦patt_free_evar y]^{svar:0↦fresh_svar phi^[evar:dbi↦ patt_free_evar y]} = eval (update_svar_val Xfr' x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi'^{svar:0↦Xfr'}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
phi': Pattern
Heqphi': phi' = phi^{evar:dbi↦x}
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi'
Xu: svar
HeqXu: Xu = svar_fresh (elements (free_svars phi'))
ρ': Valuation
Heqρ': ρ' = update_evar_val x (evar_valuation ρ y) ρ

eval (update_svar_val (fresh_svar phi^[evar:dbi↦patt_free_evar y]) x0 ρ) phi^[evar:dbi↦patt_free_evar y]^{svar:0↦fresh_svar phi^[evar:dbi↦ patt_free_evar y]} = eval (update_svar_val Xfr' x0 ρ') phi'^{svar:0↦Xfr'}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
phi': Pattern
Heqphi': phi' = phi^{evar:dbi↦x}
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi'
Xu: svar
HeqXu: Xu = svar_fresh (elements (free_svars phi'))
ρ': Valuation
Heqρ': ρ' = update_evar_val x (evar_valuation ρ y) ρ
Hfresh_subst: svar_is_fresh_in Xfr' phi' → svar_is_fresh_in Xu phi' → eval (update_svar_val Xfr' x0 ρ') phi'^{svar:0↦Xfr'} = eval (update_svar_val Xu x0 ρ') phi'^{svar:0↦Xu}

eval (update_svar_val (fresh_svar phi^[evar:dbi↦patt_free_evar y]) x0 ρ) phi^[evar:dbi↦patt_free_evar y]^{svar:0↦fresh_svar phi^[evar:dbi↦ patt_free_evar y]} = eval (update_svar_val Xfr' x0 ρ') phi'^{svar:0↦Xfr'}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
phi': Pattern
Heqphi': phi' = phi^{evar:dbi↦x}
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi'
Xu: svar
HeqXu: Xu = svar_fresh (elements (free_svars phi'))
ρ': Valuation
Heqρ': ρ' = update_evar_val x (evar_valuation ρ y) ρ
Hfresh_subst: svar_is_fresh_in Xfr' phi' → svar_is_fresh_in Xu phi' → eval (update_svar_val Xfr' x0 ρ') phi'^{svar:0↦Xfr'} = eval (update_svar_val Xu x0 ρ') phi'^{svar:0↦Xu}

eval (update_svar_val (fresh_svar phi^[evar:dbi↦patt_free_evar y]) x0 ρ) phi^[evar:dbi↦patt_free_evar y]^{svar:0↦fresh_svar phi^[evar:dbi↦ patt_free_evar y]} = eval (update_svar_val Xu x0 ρ') phi'^{svar:0↦Xu}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
phi': Pattern
Heqphi': phi' = phi^{evar:dbi↦x}
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi'
Xu: svar
HeqXu: Xu = svar_fresh (elements (free_svars phi'))
ρ': Valuation
Heqρ': ρ' = update_evar_val x (evar_valuation ρ y) ρ
Hfresh_subst: svar_is_fresh_in Xfr' phi' → svar_is_fresh_in Xu phi' → eval (update_svar_val Xfr' x0 ρ') phi'^{svar:0↦Xfr'} = eval (update_svar_val Xu x0 ρ') phi'^{svar:0↦Xu}
svar_is_fresh_in Xfr' phi'
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
phi': Pattern
Heqphi': phi' = phi^{evar:dbi↦x}
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi'
Xu: svar
HeqXu: Xu = svar_fresh (elements (free_svars phi'))
ρ': Valuation
Heqρ': ρ' = update_evar_val x (evar_valuation ρ y) ρ
Hfresh_subst: svar_is_fresh_in Xfr' phi' → svar_is_fresh_in Xu phi' → eval (update_svar_val Xfr' x0 ρ') phi'^{svar:0↦Xfr'} = eval (update_svar_val Xu x0 ρ') phi'^{svar:0↦Xu}
svar_is_fresh_in Xu phi'
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
phi': Pattern
Heqphi': phi' = phi^{evar:dbi↦x}
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi'
Xu: svar
HeqXu: Xu = svar_fresh (elements (free_svars phi'))
ρ': Valuation
Heqρ': ρ' = update_evar_val x (evar_valuation ρ y) ρ
Hfresh_subst: svar_is_fresh_in Xfr' phi' → svar_is_fresh_in Xu phi' → eval (update_svar_val Xfr' x0 ρ') phi'^{svar:0↦Xfr'} = eval (update_svar_val Xu x0 ρ') phi'^{svar:0↦Xu}

svar_is_fresh_in Xfr' phi'
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
phi': Pattern
Heqphi': phi' = phi^{evar:dbi↦x}
Xu: svar
HeqXu: Xu = svar_fresh (elements (free_svars phi'))
ρ': Valuation
Heqρ': ρ' = update_evar_val x (evar_valuation ρ y) ρ
Hfresh_subst: svar_is_fresh_in (fresh_svar phi') phi' → svar_is_fresh_in Xu phi' → eval (update_svar_val (fresh_svar phi') x0 ρ') phi'^{svar:0↦fresh_svar phi'} = eval (update_svar_val Xu x0 ρ') phi'^{svar:0↦Xu}

svar_is_fresh_in (fresh_svar phi') phi'
apply set_svar_fresh_is_fresh.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
phi': Pattern
Heqphi': phi' = phi^{evar:dbi↦x}
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi'
Xu: svar
HeqXu: Xu = svar_fresh (elements (free_svars phi'))
ρ': Valuation
Heqρ': ρ' = update_evar_val x (evar_valuation ρ y) ρ
Hfresh_subst: svar_is_fresh_in Xfr' phi' → svar_is_fresh_in Xu phi' → eval (update_svar_val Xfr' x0 ρ') phi'^{svar:0↦Xfr'} = eval (update_svar_val Xu x0 ρ') phi'^{svar:0↦Xu}

eval (update_svar_val (fresh_svar phi^[evar:dbi↦patt_free_evar y]) x0 ρ) phi^[evar:dbi↦patt_free_evar y]^{svar:0↦fresh_svar phi^[evar:dbi↦ patt_free_evar y]} = eval (update_svar_val Xu x0 ρ') phi'^{svar:0↦Xu}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
phi': Pattern
Heqphi': phi' = phi^{evar:dbi↦x}
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi'
Xu: svar
HeqXu: Xu = svar_fresh (elements (free_svars phi'))
ρ': Valuation
Heqρ': ρ' = update_evar_val x (evar_valuation ρ y) ρ
Hfresh_subst: svar_is_fresh_in Xfr' phi' → svar_is_fresh_in Xu phi' → eval (update_svar_val Xfr' x0 ρ') phi'^{svar:0↦Xfr'} = eval (update_svar_val Xu x0 ρ') phi'^{svar:0↦Xu}
svar_is_fresh_in Xu phi'
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
phi': Pattern
Heqphi': phi' = phi^{evar:dbi↦x}
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi'
Xu: svar
HeqXu: Xu = svar_fresh (elements (free_svars phi'))
ρ': Valuation
Heqρ': ρ' = update_evar_val x (evar_valuation ρ y) ρ
Hfresh_subst: svar_is_fresh_in Xfr' phi' → svar_is_fresh_in Xu phi' → eval (update_svar_val Xfr' x0 ρ') phi'^{svar:0↦Xfr'} = eval (update_svar_val Xu x0 ρ') phi'^{svar:0↦Xu}

svar_is_fresh_in Xu phi'
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
phi': Pattern
Heqphi': phi' = phi^{evar:dbi↦x}
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi'
ρ': Valuation
Heqρ': ρ' = update_evar_val x (evar_valuation ρ y) ρ
Hfresh_subst: svar_is_fresh_in Xfr' phi' → svar_is_fresh_in (svar_fresh (elements (free_svars phi'))) phi' → eval (update_svar_val Xfr' x0 ρ') phi'^{svar:0↦Xfr'} = eval (update_svar_val (svar_fresh (elements (free_svars phi'))) x0 ρ') phi'^{svar:0↦svar_fresh (elements (free_svars phi'))}

svar_is_fresh_in (svar_fresh (elements (free_svars phi'))) phi'
apply set_svar_fresh_is_fresh'.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
phi': Pattern
Heqphi': phi' = phi^{evar:dbi↦x}
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi'
Xu: svar
HeqXu: Xu = svar_fresh (elements (free_svars phi'))
ρ': Valuation
Heqρ': ρ' = update_evar_val x (evar_valuation ρ y) ρ
Hfresh_subst: svar_is_fresh_in Xfr' phi' → svar_is_fresh_in Xu phi' → eval (update_svar_val Xfr' x0 ρ') phi'^{svar:0↦Xfr'} = eval (update_svar_val Xu x0 ρ') phi'^{svar:0↦Xu}

eval (update_svar_val (fresh_svar phi^[evar:dbi↦patt_free_evar y]) x0 ρ) phi^[evar:dbi↦patt_free_evar y]^{svar:0↦fresh_svar phi^[evar:dbi↦ patt_free_evar y]} = eval (update_svar_val Xu x0 ρ') phi'^{svar:0↦Xu}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
phi': Pattern
Heqphi': phi' = phi^{evar:dbi↦x}
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi'
Xu: svar
HeqXu: Xu = svar_fresh (elements (free_svars phi'))
ρ': Valuation
Heqρ': ρ' = update_evar_val x (evar_valuation ρ y) ρ
Hfresh_subst: svar_is_fresh_in Xfr' phi' → svar_is_fresh_in Xu phi' → eval (update_svar_val Xfr' x0 ρ') phi'^{svar:0↦Xfr'} = eval (update_svar_val Xu x0 ρ') phi'^{svar:0↦Xu}
ρs1': Valuation
Heqρs1': ρs1' = update_svar_val (fresh_svar phi^[evar:dbi↦patt_free_evar y]) x0 ρ

eval ρs1' phi^[evar:dbi↦patt_free_evar y]^{svar:0↦fresh_svar phi^[evar:dbi↦ patt_free_evar y]} = eval (update_svar_val Xu x0 ρ') phi'^{svar:0↦Xu}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
phi': Pattern
Heqphi': phi' = phi^{evar:dbi↦x}
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi'
Xu: svar
HeqXu: Xu = svar_fresh (elements (free_svars phi'))
ρ': Valuation
Heqρ': ρ' = update_evar_val x (evar_valuation ρ y) ρ
Hfresh_subst: svar_is_fresh_in Xfr' phi' → svar_is_fresh_in Xu phi' → eval (update_svar_val Xfr' x0 ρ') phi'^{svar:0↦Xfr'} = eval (update_svar_val Xu x0 ρ') phi'^{svar:0↦Xu}
ρs1': Valuation
Heqρs1': ρs1' = update_svar_val (fresh_svar phi^[evar:dbi↦patt_free_evar y]) x0 ρ
ρs2': Valuation
Heqρs2': ρs2' = update_svar_val Xu x0 ρ

eval ρs1' phi^[evar:dbi↦patt_free_evar y]^{svar:0↦fresh_svar phi^[evar:dbi↦ patt_free_evar y]} = eval (update_svar_val Xu x0 ρ') phi'^{svar:0↦Xu}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
phi': Pattern
Heqphi': phi' = phi^{evar:dbi↦x}
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi'
Xu: svar
HeqXu: Xu = svar_fresh (elements (free_svars phi'))
ρ': Valuation
Heqρ': ρ' = update_evar_val x (evar_valuation ρ y) ρ
Hfresh_subst: svar_is_fresh_in Xfr' phi' → svar_is_fresh_in Xu phi' → eval (update_svar_val Xfr' x0 ρ') phi'^{svar:0↦Xfr'} = eval (update_svar_val Xu x0 ρ') phi'^{svar:0↦Xu}
ρs1': Valuation
Heqρs1': ρs1' = update_svar_val (fresh_svar phi^[evar:dbi↦patt_free_evar y]) x0 ρ
ρs2': Valuation
Heqρs2': ρs2' = update_svar_val Xu x0 ρ

eval ρs1' phi^{svar:0↦fresh_svar phi^[evar:dbi↦patt_free_evar y]}^[evar:dbi↦ patt_free_evar y] = eval (update_svar_val Xu x0 ρ') phi'^{svar:0↦Xu}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
phi': Pattern
Heqphi': phi' = phi^{evar:dbi↦x}
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi'
Xu: svar
HeqXu: Xu = svar_fresh (elements (free_svars phi'))
ρ': Valuation
Heqρ': ρ' = update_evar_val x (evar_valuation ρ y) ρ
Hfresh_subst: svar_is_fresh_in Xfr' phi' → svar_is_fresh_in Xu phi' → eval (update_svar_val Xfr' x0 ρ') phi'^{svar:0↦Xfr'} = eval (update_svar_val Xu x0 ρ') phi'^{svar:0↦Xu}
ρs1': Valuation
Heqρs1': ρs1' = update_svar_val (fresh_svar phi^[evar:dbi↦patt_free_evar y]) x0 ρ
ρs2': Valuation
Heqρs2': ρs2' = update_svar_val Xu x0 ρ
well_formed_closed (patt_free_evar y)
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
phi': Pattern
Heqphi': phi' = phi^{evar:dbi↦x}
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi'
Xu: svar
HeqXu: Xu = svar_fresh (elements (free_svars phi'))
ρ': Valuation
Heqρ': ρ' = update_evar_val x (evar_valuation ρ y) ρ
Hfresh_subst: svar_is_fresh_in Xfr' phi' → svar_is_fresh_in Xu phi' → eval (update_svar_val Xfr' x0 ρ') phi'^{svar:0↦Xfr'} = eval (update_svar_val Xu x0 ρ') phi'^{svar:0↦Xu}
ρs1': Valuation
Heqρs1': ρs1' = update_svar_val (fresh_svar phi^[evar:dbi↦patt_free_evar y]) x0 ρ
ρs2': Valuation
Heqρs2': ρs2' = update_svar_val Xu x0 ρ

eval ρs1' phi^{svar:0↦fresh_svar phi^[evar:dbi↦patt_free_evar y]}^[evar:dbi↦ patt_free_evar y] = eval (update_svar_val Xu x0 ρ') phi'^{svar:0↦Xu}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
phi': Pattern
Heqphi': phi' = phi^{evar:dbi↦x}
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi'
Xu: svar
HeqXu: Xu = svar_fresh (elements (free_svars phi'))
ρ': Valuation
Heqρ': ρ' = update_evar_val x (evar_valuation ρ y) ρ
Hfresh_subst: svar_is_fresh_in Xfr' phi' → svar_is_fresh_in Xu phi' → eval (update_svar_val Xfr' x0 ρ') phi'^{svar:0↦Xfr'} = eval (update_svar_val Xu x0 ρ') phi'^{svar:0↦Xu}
ρs1': Valuation
Xfr1: svar
HeqXfr1: Xfr1 = fresh_svar phi^[evar:dbi↦patt_free_evar y]
Heqρs1': ρs1' = update_svar_val Xfr1 x0 ρ
ρs2': Valuation
Heqρs2': ρs2' = update_svar_val Xu x0 ρ

eval ρs1' phi^{svar:0↦Xfr1}^[evar:dbi↦patt_free_evar y] = eval (update_svar_val Xu x0 ρ') phi'^{svar:0↦Xu}
(* dbi may or may not occur in phi1 *)
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
phi': Pattern
Heqphi': phi' = phi^{evar:dbi↦x}
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi'
Xu: svar
HeqXu: Xu = svar_fresh (elements (free_svars phi'))
ρ': Valuation
Heqρ': ρ' = update_evar_val x (evar_valuation ρ y) ρ
Hfresh_subst: svar_is_fresh_in Xfr' phi' → svar_is_fresh_in Xu phi' → eval (update_svar_val Xfr' x0 ρ') phi'^{svar:0↦Xfr'} = eval (update_svar_val Xu x0 ρ') phi'^{svar:0↦Xu}
ρs1': Valuation
Xfr1: svar
HeqXfr1: Xfr1 = fresh_svar phi^[evar:dbi↦patt_free_evar y]
Heqρs1': ρs1' = update_svar_val Xfr1 x0 ρ
ρs2': Valuation
Heqρs2': ρs2' = update_svar_val Xu x0 ρ
Hoc: bool
HeqHoc: Hoc = bevar_occur phi dbi

eval ρs1' phi^{svar:0↦Xfr1}^[evar:dbi↦patt_free_evar y] = eval (update_svar_val Xu x0 ρ') phi'^{svar:0↦Xu}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
phi': Pattern
Heqphi': phi' = phi^{evar:dbi↦x}
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi'
Xu: svar
HeqXu: Xu = svar_fresh (elements (free_svars phi'))
ρ': Valuation
Heqρ': ρ' = update_evar_val x (evar_valuation ρ y) ρ
Hfresh_subst: svar_is_fresh_in Xfr' phi' → svar_is_fresh_in Xu phi' → eval (update_svar_val Xfr' x0 ρ') phi'^{svar:0↦Xfr'} = eval (update_svar_val Xu x0 ρ') phi'^{svar:0↦Xu}
ρs1': Valuation
Xfr1: svar
HeqXfr1: Xfr1 = fresh_svar phi^[evar:dbi↦patt_free_evar y]
Heqρs1': ρs1' = update_svar_val Xfr1 x0 ρ
ρs2': Valuation
Heqρs2': ρs2' = update_svar_val Xu x0 ρ
Hoc: bool

Hoc = bevar_occur phi dbi → eval ρs1' phi^{svar:0↦Xfr1}^[evar:dbi↦patt_free_evar y] = eval (update_svar_val Xu x0 ρ') phi'^{svar:0↦Xu}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
phi': Pattern
Heqphi': phi' = phi^{evar:dbi↦x}
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi'
Xu: svar
HeqXu: Xu = svar_fresh (elements (free_svars phi'))
ρ': Valuation
Heqρ': ρ' = update_evar_val x (evar_valuation ρ y) ρ
Hfresh_subst: svar_is_fresh_in Xfr' phi' → svar_is_fresh_in Xu phi' → eval (update_svar_val Xfr' x0 ρ') phi'^{svar:0↦Xfr'} = eval (update_svar_val Xu x0 ρ') phi'^{svar:0↦Xu}
ρs1': Valuation
Xfr1: svar
HeqXfr1: Xfr1 = fresh_svar phi^[evar:dbi↦patt_free_evar y]
Heqρs1': ρs1' = update_svar_val Xfr1 x0 ρ
ρs2': Valuation
Heqρs2': ρs2' = update_svar_val Xu x0 ρ
HeqHoc: true = bevar_occur phi dbi

eval ρs1' phi^{svar:0↦Xfr1}^[evar:dbi↦patt_free_evar y] = eval (update_svar_val Xu x0 ρ') phi'^{svar:0↦Xu}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
phi': Pattern
Heqphi': phi' = phi^{evar:dbi↦x}
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi'
Xu: svar
HeqXu: Xu = svar_fresh (elements (free_svars phi'))
ρ': Valuation
Heqρ': ρ' = update_evar_val x (evar_valuation ρ y) ρ
Hfresh_subst: svar_is_fresh_in Xfr' phi' → svar_is_fresh_in Xu phi' → eval (update_svar_val Xfr' x0 ρ') phi'^{svar:0↦Xfr'} = eval (update_svar_val Xu x0 ρ') phi'^{svar:0↦Xu}
ρs1': Valuation
Xfr1: svar
HeqXfr1: Xfr1 = fresh_svar phi^[evar:dbi↦patt_free_evar y]
Heqρs1': ρs1' = update_svar_val Xfr1 x0 ρ
ρs2': Valuation
Heqρs2': ρs2' = update_svar_val Xu x0 ρ
HeqHoc: false = bevar_occur phi dbi
eval ρs1' phi^{svar:0↦Xfr1}^[evar:dbi↦ patt_free_evar y] = eval (update_svar_val Xu x0 ρ') phi'^{svar:0↦Xu}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
phi': Pattern
Heqphi': phi' = phi^{evar:dbi↦x}
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi'
Xu: svar
HeqXu: Xu = svar_fresh (elements (free_svars phi'))
ρ': Valuation
Heqρ': ρ' = update_evar_val x (evar_valuation ρ y) ρ
Hfresh_subst: svar_is_fresh_in Xfr' phi' → svar_is_fresh_in Xu phi' → eval (update_svar_val Xfr' x0 ρ') phi'^{svar:0↦Xfr'} = eval (update_svar_val Xu x0 ρ') phi'^{svar:0↦Xu}
ρs1': Valuation
Xfr1: svar
HeqXfr1: Xfr1 = fresh_svar phi^[evar:dbi↦patt_free_evar y]
Heqρs1': ρs1' = update_svar_val Xfr1 x0 ρ
ρs2': Valuation
Heqρs2': ρs2' = update_svar_val Xu x0 ρ
HeqHoc: true = bevar_occur phi dbi

eval ρs1' phi^{svar:0↦Xfr1}^[evar:dbi↦patt_free_evar y] = eval (update_svar_val Xu x0 ρ') phi'^{svar:0↦Xu}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
phi': Pattern
Heqphi': phi' = phi^{evar:dbi↦x}
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi'
Xu: svar
HeqXu: Xu = svar_fresh (elements (free_svars phi'))
ρ': Valuation
Heqρ': ρ' = update_evar_val x (evar_valuation ρ y) ρ
Hfresh_subst: svar_is_fresh_in Xfr' phi' → svar_is_fresh_in Xu phi' → eval (update_svar_val Xfr' x0 ρ') phi'^{svar:0↦Xfr'} = eval (update_svar_val Xu x0 ρ') phi'^{svar:0↦Xu}
ρs1': Valuation
Xfr1: svar
HeqXfr1: Xfr1 = fresh_svar phi^[evar:dbi↦patt_free_evar y]
Heqρs1': ρs1' = update_svar_val Xfr1 x0 ρ
ρs2': Valuation
Heqρs2': ρs2' = update_svar_val Xu x0 ρ
HeqHoc: true = bevar_occur phi dbi
HXfr1Fresh: svar_is_fresh_in (fresh_svar phi^[evar:dbi↦patt_free_evar y]) phi^[evar:dbi↦patt_free_evar y]

eval ρs1' phi^{svar:0↦Xfr1}^[evar:dbi↦patt_free_evar y] = eval (update_svar_val Xu x0 ρ') phi'^{svar:0↦Xu}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
phi': Pattern
Heqphi': phi' = phi^{evar:dbi↦x}
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi'
Xu: svar
HeqXu: Xu = svar_fresh (elements (free_svars phi'))
ρ': Valuation
Heqρ': ρ' = update_evar_val x (evar_valuation ρ y) ρ
Hfresh_subst: svar_is_fresh_in Xfr' phi' → svar_is_fresh_in Xu phi' → eval (update_svar_val Xfr' x0 ρ') phi'^{svar:0↦Xfr'} = eval (update_svar_val Xu x0 ρ') phi'^{svar:0↦Xu}
ρs1': Valuation
Xfr1: svar
HeqXfr1: Xfr1 = fresh_svar phi^[evar:dbi↦patt_free_evar y]
Heqρs1': ρs1' = update_svar_val Xfr1 x0 ρ
ρs2': Valuation
Heqρs2': ρs2' = update_svar_val Xu x0 ρ
HeqHoc: true = bevar_occur phi dbi
HXfr1Fresh: svar_is_fresh_in Xfr1 phi^[evar:dbi↦patt_free_evar y]

eval ρs1' phi^{svar:0↦Xfr1}^[evar:dbi↦patt_free_evar y] = eval (update_svar_val Xu x0 ρ') phi'^{svar:0↦Xu}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
phi': Pattern
Heqphi': phi' = phi^{evar:dbi↦x}
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi'
Xu: svar
HeqXu: Xu = svar_fresh (elements (free_svars phi'))
ρ': Valuation
Heqρ': ρ' = update_evar_val x (evar_valuation ρ y) ρ
Hfresh_subst: svar_is_fresh_in Xfr' phi' → svar_is_fresh_in Xu phi' → eval (update_svar_val Xfr' x0 ρ') phi'^{svar:0↦Xfr'} = eval (update_svar_val Xu x0 ρ') phi'^{svar:0↦Xu}
ρs1': Valuation
Xfr1: svar
HeqXfr1: Xfr1 = fresh_svar phi^[evar:dbi↦patt_free_evar y]
Heqρs1': ρs1' = update_svar_val Xfr1 x0 ρ
ρs2': Valuation
Heqρs2': ρs2' = update_svar_val Xu x0 ρ
HeqHoc: bevar_occur phi dbi = true
HXfr1Fresh: svar_is_fresh_in Xfr1 phi^[evar:dbi↦patt_free_evar y]

eval ρs1' phi^{svar:0↦Xfr1}^[evar:dbi↦patt_free_evar y] = eval (update_svar_val Xu x0 ρ') phi'^{svar:0↦Xu}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
phi': Pattern
Heqphi': phi' = phi^{evar:dbi↦x}
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi'
Xu: svar
HeqXu: Xu = svar_fresh (elements (free_svars phi'))
ρ': Valuation
Heqρ': ρ' = update_evar_val x (evar_valuation ρ y) ρ
Hfresh_subst: svar_is_fresh_in Xfr' phi' → svar_is_fresh_in Xu phi' → eval (update_svar_val Xfr' x0 ρ') phi'^{svar:0↦Xfr'} = eval (update_svar_val Xu x0 ρ') phi'^{svar:0↦Xu}
ρs1': Valuation
Xfr1: svar
HeqXfr1: Xfr1 = fresh_svar phi^[evar:dbi↦patt_free_evar y]
Heqρs1': ρs1' = update_svar_val Xfr1 x0 ρ
ρs2': Valuation
Heqρs2': ρs2' = update_svar_val Xu x0 ρ
HeqHoc: bevar_occur phi dbi = true
HXfr1Fresh: svar_is_fresh_in Xfr1 phi^[evar:dbi↦patt_free_evar y]
Hsub: is_subformula_of_ind (patt_free_evar y) phi^[evar:dbi↦patt_free_evar y]

eval ρs1' phi^{svar:0↦Xfr1}^[evar:dbi↦patt_free_evar y] = eval (update_svar_val Xu x0 ρ') phi'^{svar:0↦Xu}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
phi': Pattern
Heqphi': phi' = phi^{evar:dbi↦x}
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi'
Xu: svar
HeqXu: Xu = svar_fresh (elements (free_svars phi'))
ρ': Valuation
Heqρ': ρ' = update_evar_val x (evar_valuation ρ y) ρ
Hfresh_subst: svar_is_fresh_in Xfr' phi' → svar_is_fresh_in Xu phi' → eval (update_svar_val Xfr' x0 ρ') phi'^{svar:0↦Xfr'} = eval (update_svar_val Xu x0 ρ') phi'^{svar:0↦Xu}
ρs1': Valuation
Xfr1: svar
HeqXfr1: Xfr1 = fresh_svar phi^[evar:dbi↦patt_free_evar y]
Heqρs1': ρs1' = update_svar_val Xfr1 x0 ρ
ρs2': Valuation
Heqρs2': ρs2' = update_svar_val Xu x0 ρ
HeqHoc: bevar_occur phi dbi = true
HXfr1Fresh: svar_is_fresh_in Xfr1 phi^[evar:dbi↦patt_free_evar y]
Hsub: is_subformula_of_ind (patt_free_evar y) phi^[evar:dbi↦patt_free_evar y]
HXfr1Fresh2: svar_is_fresh_in Xfr1 (patt_free_evar y)

eval ρs1' phi^{svar:0↦Xfr1}^[evar:dbi↦patt_free_evar y] = eval (update_svar_val Xu x0 ρ') phi'^{svar:0↦Xu}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
phi': Pattern
Heqphi': phi' = phi^{evar:dbi↦x}
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi'
Xu: svar
HeqXu: Xu = svar_fresh (elements (free_svars phi'))
ρ': Valuation
Heqρ': ρ' = update_evar_val x (evar_valuation ρ y) ρ
Hfresh_subst: svar_is_fresh_in Xfr' phi' → svar_is_fresh_in Xu phi' → eval (update_svar_val Xfr' x0 ρ') phi'^{svar:0↦Xfr'} = eval (update_svar_val Xu x0 ρ') phi'^{svar:0↦Xu}
ρs1': Valuation
Xfr1: svar
HeqXfr1: Xfr1 = fresh_svar phi^[evar:dbi↦patt_free_evar y]
Heqρs1': ρs1' = update_svar_val Xfr1 x0 ρ
ρs2': Valuation
Heqρs2': ρs2' = update_svar_val Xu x0 ρ
HeqHoc: bevar_occur phi dbi = true
HXfr1Fresh: svar_is_fresh_in Xfr1 phi^[evar:dbi↦patt_free_evar y]
Hsub: is_subformula_of_ind (patt_free_evar y) phi^[evar:dbi↦patt_free_evar y]
HXfr1Fresh2: svar_is_fresh_in Xfr1 (patt_free_evar y)

Xfr1 = Xu
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
phi': Pattern
Heqphi': phi' = phi^{evar:dbi↦x}
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi'
Xu: svar
HeqXu: Xu = svar_fresh (elements (free_svars phi'))
ρ': Valuation
Heqρ': ρ' = update_evar_val x (evar_valuation ρ y) ρ
Hfresh_subst: svar_is_fresh_in Xfr' phi' → svar_is_fresh_in Xu phi' → eval (update_svar_val Xfr' x0 ρ') phi'^{svar:0↦Xfr'} = eval (update_svar_val Xu x0 ρ') phi'^{svar:0↦Xu}
ρs1': Valuation
Xfr1: svar
HeqXfr1: Xfr1 = fresh_svar phi^[evar:dbi↦patt_free_evar y]
Heqρs1': ρs1' = update_svar_val Xfr1 x0 ρ
ρs2': Valuation
Heqρs2': ρs2' = update_svar_val Xu x0 ρ
HeqHoc: bevar_occur phi dbi = true
HXfr1Fresh: svar_is_fresh_in Xfr1 phi^[evar:dbi↦patt_free_evar y]
Hsub: is_subformula_of_ind (patt_free_evar y) phi^[evar:dbi↦patt_free_evar y]
HXfr1Fresh2: svar_is_fresh_in Xfr1 (patt_free_evar y)
HXu: Xfr1 = Xu
eval ρs1' phi^{svar:0↦Xfr1}^[evar:dbi↦ patt_free_evar y] = eval (update_svar_val Xu x0 ρ') phi'^{svar:0↦Xu}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
phi': Pattern
Heqphi': phi' = phi^{evar:dbi↦x}
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi'
Xu: svar
HeqXu: Xu = svar_fresh (elements (free_svars phi'))
ρ': Valuation
Heqρ': ρ' = update_evar_val x (evar_valuation ρ y) ρ
Hfresh_subst: svar_is_fresh_in Xfr' phi' → svar_is_fresh_in Xu phi' → eval (update_svar_val Xfr' x0 ρ') phi'^{svar:0↦Xfr'} = eval (update_svar_val Xu x0 ρ') phi'^{svar:0↦Xu}
ρs1': Valuation
Xfr1: svar
HeqXfr1: Xfr1 = fresh_svar phi^[evar:dbi↦patt_free_evar y]
Heqρs1': ρs1' = update_svar_val Xfr1 x0 ρ
ρs2': Valuation
Heqρs2': ρs2' = update_svar_val Xu x0 ρ
HeqHoc: bevar_occur phi dbi = true
HXfr1Fresh: svar_is_fresh_in Xfr1 phi^[evar:dbi↦patt_free_evar y]
Hsub: is_subformula_of_ind (patt_free_evar y) phi^[evar:dbi↦patt_free_evar y]
HXfr1Fresh2: svar_is_fresh_in Xfr1 (patt_free_evar y)

Xfr1 = Xu
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
phi': Pattern
Heqphi': phi' = phi^{evar:dbi↦x}
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi'
Xu: svar
HeqXu: Xu = svar_fresh (elements (free_svars phi'))
ρ': Valuation
Heqρ': ρ' = update_evar_val x (evar_valuation ρ y) ρ
Hfresh_subst: svar_is_fresh_in Xfr' phi' → svar_is_fresh_in Xu phi' → eval (update_svar_val Xfr' x0 ρ') phi'^{svar:0↦Xfr'} = eval (update_svar_val Xu x0 ρ') phi'^{svar:0↦Xu}
ρs1': Valuation
Heqρs1': ρs1' = update_svar_val (fresh_svar phi^[evar:dbi↦patt_free_evar y]) x0 ρ
ρs2': Valuation
Heqρs2': ρs2' = update_svar_val Xu x0 ρ
HeqHoc: bevar_occur phi dbi = true
HXfr1Fresh: svar_is_fresh_in (fresh_svar phi^[evar:dbi↦patt_free_evar y]) phi^[evar:dbi↦patt_free_evar y]
Hsub: is_subformula_of_ind (patt_free_evar y) phi^[evar:dbi↦patt_free_evar y]
HXfr1Fresh2: svar_is_fresh_in (fresh_svar phi^[evar:dbi↦patt_free_evar y]) (patt_free_evar y)

fresh_svar phi^[evar:dbi↦patt_free_evar y] = Xu
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
phi': Pattern
Heqphi': phi' = phi^{evar:dbi↦x}
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi'
ρ': Valuation
Heqρ': ρ' = update_evar_val x (evar_valuation ρ y) ρ
Hfresh_subst: svar_is_fresh_in Xfr' phi' → svar_is_fresh_in (svar_fresh (elements (free_svars phi'))) phi' → eval (update_svar_val Xfr' x0 ρ') phi'^{svar:0↦Xfr'} = eval (update_svar_val (svar_fresh (elements (free_svars phi'))) x0 ρ') phi'^{svar:0↦svar_fresh (elements (free_svars phi'))}
ρs1': Valuation
Heqρs1': ρs1' = update_svar_val (fresh_svar phi^[evar:dbi↦patt_free_evar y]) x0 ρ
ρs2': Valuation
Heqρs2': ρs2' = update_svar_val (svar_fresh (elements (free_svars phi'))) x0 ρ
HeqHoc: bevar_occur phi dbi = true
HXfr1Fresh: svar_is_fresh_in (fresh_svar phi^[evar:dbi↦patt_free_evar y]) phi^[evar:dbi↦patt_free_evar y]
Hsub: is_subformula_of_ind (patt_free_evar y) phi^[evar:dbi↦patt_free_evar y]
HXfr1Fresh2: svar_is_fresh_in (fresh_svar phi^[evar:dbi↦patt_free_evar y]) (patt_free_evar y)

fresh_svar phi^[evar:dbi↦patt_free_evar y] = svar_fresh (elements (free_svars phi'))
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi^{evar:dbi↦x}
ρ': Valuation
Heqρ': ρ' = update_evar_val x (evar_valuation ρ y) ρ
Hfresh_subst: svar_is_fresh_in Xfr' phi^{evar:dbi↦x} → svar_is_fresh_in (svar_fresh (elements (free_svars phi^{evar:dbi↦x}))) phi^{evar:dbi↦x} → eval (update_svar_val Xfr' x0 ρ') phi^{evar:dbi↦x}^{svar:0↦Xfr'} = eval (update_svar_val (svar_fresh (elements (free_svars phi^{evar:dbi↦x}))) x0 ρ') phi^{evar:dbi↦x}^{svar:0↦ svar_fresh (elements (free_svars phi^{evar:dbi↦x}))}
ρs1': Valuation
Heqρs1': ρs1' = update_svar_val (fresh_svar phi^[evar:dbi↦patt_free_evar y]) x0 ρ
ρs2': Valuation
Heqρs2': ρs2' = update_svar_val (svar_fresh (elements (free_svars phi^{evar:dbi↦x}))) x0 ρ
HeqHoc: bevar_occur phi dbi = true
HXfr1Fresh: svar_is_fresh_in (fresh_svar phi^[evar:dbi↦patt_free_evar y]) phi^[evar:dbi↦patt_free_evar y]
Hsub: is_subformula_of_ind (patt_free_evar y) phi^[evar:dbi↦patt_free_evar y]
HXfr1Fresh2: svar_is_fresh_in (fresh_svar phi^[evar:dbi↦patt_free_evar y]) (patt_free_evar y)

fresh_svar phi^[evar:dbi↦patt_free_evar y] = svar_fresh (elements (free_svars phi^{evar:dbi↦x}))
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi^{evar:dbi↦x}
ρ': Valuation
Heqρ': ρ' = update_evar_val x (evar_valuation ρ y) ρ
Hfresh_subst: svar_is_fresh_in Xfr' phi^{evar:dbi↦x} → svar_is_fresh_in (svar_fresh (elements (free_svars phi^{evar:dbi↦x}))) phi^{evar:dbi↦x} → eval (update_svar_val Xfr' x0 ρ') phi^{evar:dbi↦x}^{svar:0↦Xfr'} = eval (update_svar_val (svar_fresh (elements (free_svars phi^{evar:dbi↦x}))) x0 ρ') phi^{evar:dbi↦x}^{svar:0↦ svar_fresh (elements (free_svars phi^{evar:dbi↦x}))}
ρs1': Valuation
Heqρs1': ρs1' = update_svar_val (fresh_svar phi^[evar:dbi↦patt_free_evar y]) x0 ρ
ρs2': Valuation
Heqρs2': ρs2' = update_svar_val (svar_fresh (elements (free_svars phi^{evar:dbi↦x}))) x0 ρ
HeqHoc: bevar_occur phi dbi = true
HXfr1Fresh: svar_is_fresh_in (fresh_svar phi^[evar:dbi↦patt_free_evar y]) phi^[evar:dbi↦patt_free_evar y]
Hsub: is_subformula_of_ind (patt_free_evar y) phi^[evar:dbi↦patt_free_evar y]
HXfr1Fresh2: svar_is_fresh_in (fresh_svar phi^[evar:dbi↦patt_free_evar y]) (patt_free_evar y)

svar_fresh_s (free_svars phi^[evar:dbi↦patt_free_evar y]) = svar_fresh (elements (free_svars phi^{evar:dbi↦x}))
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi^{evar:dbi↦x}
ρ': Valuation
Heqρ': ρ' = update_evar_val x (evar_valuation ρ y) ρ
Hfresh_subst: svar_is_fresh_in Xfr' phi^{evar:dbi↦x} → svar_is_fresh_in (svar_fresh (elements (free_svars phi^{evar:dbi↦x}))) phi^{evar:dbi↦x} → eval (update_svar_val Xfr' x0 ρ') phi^{evar:dbi↦x}^{svar:0↦Xfr'} = eval (update_svar_val (svar_fresh (elements (free_svars phi^{evar:dbi↦x}))) x0 ρ') phi^{evar:dbi↦x}^{svar:0↦ svar_fresh (elements (free_svars phi^{evar:dbi↦x}))}
ρs1': Valuation
Heqρs1': ρs1' = update_svar_val (fresh_svar phi^[evar:dbi↦patt_free_evar y]) x0 ρ
ρs2': Valuation
Heqρs2': ρs2' = update_svar_val (svar_fresh (elements (free_svars phi^{evar:dbi↦x}))) x0 ρ
HeqHoc: bevar_occur phi dbi = true
HXfr1Fresh: svar_is_fresh_in (fresh_svar phi^[evar:dbi↦patt_free_evar y]) phi^[evar:dbi↦patt_free_evar y]
Hsub: is_subformula_of_ind (patt_free_evar y) phi^[evar:dbi↦patt_free_evar y]
HXfr1Fresh2: svar_is_fresh_in (fresh_svar phi^[evar:dbi↦patt_free_evar y]) (patt_free_evar y)

svar_fresh_s (free_svars phi ∪ free_svars (patt_free_evar y)) = svar_fresh (elements (free_svars phi^{evar:dbi↦x}))
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi^{evar:dbi↦x}
ρ': Valuation
Heqρ': ρ' = update_evar_val x (evar_valuation ρ y) ρ
Hfresh_subst: svar_is_fresh_in Xfr' phi^{evar:dbi↦x} → svar_is_fresh_in (svar_fresh (elements (free_svars phi^{evar:dbi↦x}))) phi^{evar:dbi↦x} → eval (update_svar_val Xfr' x0 ρ') phi^{evar:dbi↦x}^{svar:0↦Xfr'} = eval (update_svar_val (svar_fresh (elements (free_svars phi^{evar:dbi↦x}))) x0 ρ') phi^{evar:dbi↦x}^{svar:0↦ svar_fresh (elements (free_svars phi^{evar:dbi↦x}))}
ρs1': Valuation
Heqρs1': ρs1' = update_svar_val (fresh_svar phi^[evar:dbi↦patt_free_evar y]) x0 ρ
ρs2': Valuation
Heqρs2': ρs2' = update_svar_val (svar_fresh (elements (free_svars phi^{evar:dbi↦x}))) x0 ρ
HeqHoc: bevar_occur phi dbi = true
HXfr1Fresh: svar_is_fresh_in (fresh_svar phi^[evar:dbi↦patt_free_evar y]) phi^[evar:dbi↦patt_free_evar y]
Hsub: is_subformula_of_ind (patt_free_evar y) phi^[evar:dbi↦patt_free_evar y]
HXfr1Fresh2: svar_is_fresh_in (fresh_svar phi^[evar:dbi↦patt_free_evar y]) (patt_free_evar y)
bevar_occur phi dbi
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi^{evar:dbi↦x}
ρ': Valuation
Heqρ': ρ' = update_evar_val x (evar_valuation ρ y) ρ
Hfresh_subst: svar_is_fresh_in Xfr' phi^{evar:dbi↦x} → svar_is_fresh_in (svar_fresh (elements (free_svars phi^{evar:dbi↦x}))) phi^{evar:dbi↦x} → eval (update_svar_val Xfr' x0 ρ') phi^{evar:dbi↦x}^{svar:0↦Xfr'} = eval (update_svar_val (svar_fresh (elements (free_svars phi^{evar:dbi↦x}))) x0 ρ') phi^{evar:dbi↦x}^{svar:0↦ svar_fresh (elements (free_svars phi^{evar:dbi↦x}))}
ρs1': Valuation
Heqρs1': ρs1' = update_svar_val (fresh_svar phi^[evar:dbi↦patt_free_evar y]) x0 ρ
ρs2': Valuation
Heqρs2': ρs2' = update_svar_val (svar_fresh (elements (free_svars phi^{evar:dbi↦x}))) x0 ρ
HeqHoc: bevar_occur phi dbi = true
HXfr1Fresh: svar_is_fresh_in (fresh_svar phi^[evar:dbi↦patt_free_evar y]) phi^[evar:dbi↦patt_free_evar y]
Hsub: is_subformula_of_ind (patt_free_evar y) phi^[evar:dbi↦patt_free_evar y]
HXfr1Fresh2: svar_is_fresh_in (fresh_svar phi^[evar:dbi↦patt_free_evar y]) (patt_free_evar y)

svar_fresh_s (free_svars phi ∪ free_svars (patt_free_evar y)) = svar_fresh (elements (free_svars phi))
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi^{evar:dbi↦x}
ρ': Valuation
Heqρ': ρ' = update_evar_val x (evar_valuation ρ y) ρ
Hfresh_subst: svar_is_fresh_in Xfr' phi^{evar:dbi↦x} → svar_is_fresh_in (svar_fresh (elements (free_svars phi^{evar:dbi↦x}))) phi^{evar:dbi↦x} → eval (update_svar_val Xfr' x0 ρ') phi^{evar:dbi↦x}^{svar:0↦Xfr'} = eval (update_svar_val (svar_fresh (elements (free_svars phi^{evar:dbi↦x}))) x0 ρ') phi^{evar:dbi↦x}^{svar:0↦ svar_fresh (elements (free_svars phi^{evar:dbi↦x}))}
ρs1': Valuation
Heqρs1': ρs1' = update_svar_val (fresh_svar phi^[evar:dbi↦patt_free_evar y]) x0 ρ
ρs2': Valuation
Heqρs2': ρs2' = update_svar_val (svar_fresh (elements (free_svars phi^{evar:dbi↦x}))) x0 ρ
HeqHoc: bevar_occur phi dbi = true
HXfr1Fresh: svar_is_fresh_in (fresh_svar phi^[evar:dbi↦patt_free_evar y]) phi^[evar:dbi↦patt_free_evar y]
Hsub: is_subformula_of_ind (patt_free_evar y) phi^[evar:dbi↦patt_free_evar y]
HXfr1Fresh2: svar_is_fresh_in (fresh_svar phi^[evar:dbi↦patt_free_evar y]) (patt_free_evar y)
bevar_occur phi dbi
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi^{evar:dbi↦x}
ρ': Valuation
Heqρ': ρ' = update_evar_val x (evar_valuation ρ y) ρ
Hfresh_subst: svar_is_fresh_in Xfr' phi^{evar:dbi↦x} → svar_is_fresh_in (svar_fresh (elements (free_svars phi^{evar:dbi↦x}))) phi^{evar:dbi↦x} → eval (update_svar_val Xfr' x0 ρ') phi^{evar:dbi↦x}^{svar:0↦Xfr'} = eval (update_svar_val (svar_fresh (elements (free_svars phi^{evar:dbi↦x}))) x0 ρ') phi^{evar:dbi↦x}^{svar:0↦ svar_fresh (elements (free_svars phi^{evar:dbi↦x}))}
ρs1': Valuation
Heqρs1': ρs1' = update_svar_val (fresh_svar phi^[evar:dbi↦patt_free_evar y]) x0 ρ
ρs2': Valuation
Heqρs2': ρs2' = update_svar_val (svar_fresh (elements (free_svars phi^{evar:dbi↦x}))) x0 ρ
HeqHoc: bevar_occur phi dbi = true
HXfr1Fresh: svar_is_fresh_in (fresh_svar phi^[evar:dbi↦patt_free_evar y]) phi^[evar:dbi↦patt_free_evar y]
Hsub: is_subformula_of_ind (patt_free_evar y) phi^[evar:dbi↦patt_free_evar y]
HXfr1Fresh2: svar_is_fresh_in (fresh_svar phi^[evar:dbi↦patt_free_evar y]) (patt_free_evar y)
Hsvev: free_svars (patt_free_evar y) = ∅

svar_fresh_s (free_svars phi ∪ free_svars (patt_free_evar y)) = svar_fresh (elements (free_svars phi))
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi^{evar:dbi↦x}
ρ': Valuation
Heqρ': ρ' = update_evar_val x (evar_valuation ρ y) ρ
Hfresh_subst: svar_is_fresh_in Xfr' phi^{evar:dbi↦x} → svar_is_fresh_in (svar_fresh (elements (free_svars phi^{evar:dbi↦x}))) phi^{evar:dbi↦x} → eval (update_svar_val Xfr' x0 ρ') phi^{evar:dbi↦x}^{svar:0↦Xfr'} = eval (update_svar_val (svar_fresh (elements (free_svars phi^{evar:dbi↦x}))) x0 ρ') phi^{evar:dbi↦x}^{svar:0↦ svar_fresh (elements (free_svars phi^{evar:dbi↦x}))}
ρs1': Valuation
Heqρs1': ρs1' = update_svar_val (fresh_svar phi^[evar:dbi↦patt_free_evar y]) x0 ρ
ρs2': Valuation
Heqρs2': ρs2' = update_svar_val (svar_fresh (elements (free_svars phi^{evar:dbi↦x}))) x0 ρ
HeqHoc: bevar_occur phi dbi = true
HXfr1Fresh: svar_is_fresh_in (fresh_svar phi^[evar:dbi↦patt_free_evar y]) phi^[evar:dbi↦patt_free_evar y]
Hsub: is_subformula_of_ind (patt_free_evar y) phi^[evar:dbi↦patt_free_evar y]
HXfr1Fresh2: svar_is_fresh_in (fresh_svar phi^[evar:dbi↦patt_free_evar y]) (patt_free_evar y)
bevar_occur phi dbi
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi^{evar:dbi↦x}
ρ': Valuation
Heqρ': ρ' = update_evar_val x (evar_valuation ρ y) ρ
Hfresh_subst: svar_is_fresh_in Xfr' phi^{evar:dbi↦x} → svar_is_fresh_in (svar_fresh (elements (free_svars phi^{evar:dbi↦x}))) phi^{evar:dbi↦x} → eval (update_svar_val Xfr' x0 ρ') phi^{evar:dbi↦x}^{svar:0↦Xfr'} = eval (update_svar_val (svar_fresh (elements (free_svars phi^{evar:dbi↦x}))) x0 ρ') phi^{evar:dbi↦x}^{svar:0↦ svar_fresh (elements (free_svars phi^{evar:dbi↦x}))}
ρs1': Valuation
Heqρs1': ρs1' = update_svar_val (fresh_svar phi^[evar:dbi↦patt_free_evar y]) x0 ρ
ρs2': Valuation
Heqρs2': ρs2' = update_svar_val (svar_fresh (elements (free_svars phi^{evar:dbi↦x}))) x0 ρ
HeqHoc: bevar_occur phi dbi = true
HXfr1Fresh: svar_is_fresh_in (fresh_svar phi^[evar:dbi↦patt_free_evar y]) phi^[evar:dbi↦patt_free_evar y]
Hsub: is_subformula_of_ind (patt_free_evar y) phi^[evar:dbi↦patt_free_evar y]
HXfr1Fresh2: svar_is_fresh_in (fresh_svar phi^[evar:dbi↦patt_free_evar y]) (patt_free_evar y)
Hsvev: free_svars (patt_free_evar y) = ∅

svar_fresh_s (free_svars phi ∪ ∅) = svar_fresh (elements (free_svars phi))
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi^{evar:dbi↦x}
ρ': Valuation
Heqρ': ρ' = update_evar_val x (evar_valuation ρ y) ρ
Hfresh_subst: svar_is_fresh_in Xfr' phi^{evar:dbi↦x} → svar_is_fresh_in (svar_fresh (elements (free_svars phi^{evar:dbi↦x}))) phi^{evar:dbi↦x} → eval (update_svar_val Xfr' x0 ρ') phi^{evar:dbi↦x}^{svar:0↦Xfr'} = eval (update_svar_val (svar_fresh (elements (free_svars phi^{evar:dbi↦x}))) x0 ρ') phi^{evar:dbi↦x}^{svar:0↦ svar_fresh (elements (free_svars phi^{evar:dbi↦x}))}
ρs1': Valuation
Heqρs1': ρs1' = update_svar_val (fresh_svar phi^[evar:dbi↦patt_free_evar y]) x0 ρ
ρs2': Valuation
Heqρs2': ρs2' = update_svar_val (svar_fresh (elements (free_svars phi^{evar:dbi↦x}))) x0 ρ
HeqHoc: bevar_occur phi dbi = true
HXfr1Fresh: svar_is_fresh_in (fresh_svar phi^[evar:dbi↦patt_free_evar y]) phi^[evar:dbi↦patt_free_evar y]
Hsub: is_subformula_of_ind (patt_free_evar y) phi^[evar:dbi↦patt_free_evar y]
HXfr1Fresh2: svar_is_fresh_in (fresh_svar phi^[evar:dbi↦patt_free_evar y]) (patt_free_evar y)
bevar_occur phi dbi
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi^{evar:dbi↦x}
ρ': Valuation
Heqρ': ρ' = update_evar_val x (evar_valuation ρ y) ρ
Hfresh_subst: svar_is_fresh_in Xfr' phi^{evar:dbi↦x} → svar_is_fresh_in (svar_fresh (elements (free_svars phi^{evar:dbi↦x}))) phi^{evar:dbi↦x} → eval (update_svar_val Xfr' x0 ρ') phi^{evar:dbi↦x}^{svar:0↦Xfr'} = eval (update_svar_val (svar_fresh (elements (free_svars phi^{evar:dbi↦x}))) x0 ρ') phi^{evar:dbi↦x}^{svar:0↦ svar_fresh (elements (free_svars phi^{evar:dbi↦x}))}
ρs1': Valuation
Heqρs1': ρs1' = update_svar_val (fresh_svar phi^[evar:dbi↦patt_free_evar y]) x0 ρ
ρs2': Valuation
Heqρs2': ρs2' = update_svar_val (svar_fresh (elements (free_svars phi^{evar:dbi↦x}))) x0 ρ
HeqHoc: bevar_occur phi dbi = true
HXfr1Fresh: svar_is_fresh_in (fresh_svar phi^[evar:dbi↦patt_free_evar y]) phi^[evar:dbi↦patt_free_evar y]
Hsub: is_subformula_of_ind (patt_free_evar y) phi^[evar:dbi↦patt_free_evar y]
HXfr1Fresh2: svar_is_fresh_in (fresh_svar phi^[evar:dbi↦patt_free_evar y]) (patt_free_evar y)
Hsvev: free_svars (patt_free_evar y) = ∅

svar_fresh_s (free_svars phi) = svar_fresh (elements (free_svars phi))
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi^{evar:dbi↦x}
ρ': Valuation
Heqρ': ρ' = update_evar_val x (evar_valuation ρ y) ρ
Hfresh_subst: svar_is_fresh_in Xfr' phi^{evar:dbi↦x} → svar_is_fresh_in (svar_fresh (elements (free_svars phi^{evar:dbi↦x}))) phi^{evar:dbi↦x} → eval (update_svar_val Xfr' x0 ρ') phi^{evar:dbi↦x}^{svar:0↦Xfr'} = eval (update_svar_val (svar_fresh (elements (free_svars phi^{evar:dbi↦x}))) x0 ρ') phi^{evar:dbi↦x}^{svar:0↦ svar_fresh (elements (free_svars phi^{evar:dbi↦x}))}
ρs1': Valuation
Heqρs1': ρs1' = update_svar_val (fresh_svar phi^[evar:dbi↦patt_free_evar y]) x0 ρ
ρs2': Valuation
Heqρs2': ρs2' = update_svar_val (svar_fresh (elements (free_svars phi^{evar:dbi↦x}))) x0 ρ
HeqHoc: bevar_occur phi dbi = true
HXfr1Fresh: svar_is_fresh_in (fresh_svar phi^[evar:dbi↦patt_free_evar y]) phi^[evar:dbi↦patt_free_evar y]
Hsub: is_subformula_of_ind (patt_free_evar y) phi^[evar:dbi↦patt_free_evar y]
HXfr1Fresh2: svar_is_fresh_in (fresh_svar phi^[evar:dbi↦patt_free_evar y]) (patt_free_evar y)
bevar_occur phi dbi
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi^{evar:dbi↦x}
ρ': Valuation
Heqρ': ρ' = update_evar_val x (evar_valuation ρ y) ρ
Hfresh_subst: svar_is_fresh_in Xfr' phi^{evar:dbi↦x} → svar_is_fresh_in (svar_fresh (elements (free_svars phi^{evar:dbi↦x}))) phi^{evar:dbi↦x} → eval (update_svar_val Xfr' x0 ρ') phi^{evar:dbi↦x}^{svar:0↦Xfr'} = eval (update_svar_val (svar_fresh (elements (free_svars phi^{evar:dbi↦x}))) x0 ρ') phi^{evar:dbi↦x}^{svar:0↦ svar_fresh (elements (free_svars phi^{evar:dbi↦x}))}
ρs1': Valuation
Heqρs1': ρs1' = update_svar_val (fresh_svar phi^[evar:dbi↦patt_free_evar y]) x0 ρ
ρs2': Valuation
Heqρs2': ρs2' = update_svar_val (svar_fresh (elements (free_svars phi^{evar:dbi↦x}))) x0 ρ
HeqHoc: bevar_occur phi dbi = true
HXfr1Fresh: svar_is_fresh_in (fresh_svar phi^[evar:dbi↦patt_free_evar y]) phi^[evar:dbi↦patt_free_evar y]
Hsub: is_subformula_of_ind (patt_free_evar y) phi^[evar:dbi↦patt_free_evar y]
HXfr1Fresh2: svar_is_fresh_in (fresh_svar phi^[evar:dbi↦patt_free_evar y]) (patt_free_evar y)

bevar_occur phi dbi
assumption.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
phi': Pattern
Heqphi': phi' = phi^{evar:dbi↦x}
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi'
Xu: svar
HeqXu: Xu = svar_fresh (elements (free_svars phi'))
ρ': Valuation
Heqρ': ρ' = update_evar_val x (evar_valuation ρ y) ρ
Hfresh_subst: svar_is_fresh_in Xfr' phi' → svar_is_fresh_in Xu phi' → eval (update_svar_val Xfr' x0 ρ') phi'^{svar:0↦Xfr'} = eval (update_svar_val Xu x0 ρ') phi'^{svar:0↦Xu}
ρs1': Valuation
Xfr1: svar
HeqXfr1: Xfr1 = fresh_svar phi^[evar:dbi↦patt_free_evar y]
Heqρs1': ρs1' = update_svar_val Xfr1 x0 ρ
ρs2': Valuation
Heqρs2': ρs2' = update_svar_val Xu x0 ρ
HeqHoc: bevar_occur phi dbi = true
HXfr1Fresh: svar_is_fresh_in Xfr1 phi^[evar:dbi↦patt_free_evar y]
Hsub: is_subformula_of_ind (patt_free_evar y) phi^[evar:dbi↦patt_free_evar y]
HXfr1Fresh2: svar_is_fresh_in Xfr1 (patt_free_evar y)
HXu: Xfr1 = Xu

eval ρs1' phi^{svar:0↦Xfr1}^[evar:dbi↦patt_free_evar y] = eval (update_svar_val Xu x0 ρ') phi'^{svar:0↦Xu}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
phi': Pattern
Heqphi': phi' = phi^{evar:dbi↦x}
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi'
Xu: svar
HeqXu: Xu = svar_fresh (elements (free_svars phi'))
ρ': Valuation
Heqρ': ρ' = update_evar_val x (evar_valuation ρ y) ρ
Hfresh_subst: svar_is_fresh_in Xfr' phi' → svar_is_fresh_in Xu phi' → eval (update_svar_val Xfr' x0 ρ') phi'^{svar:0↦Xfr'} = eval (update_svar_val Xu x0 ρ') phi'^{svar:0↦Xu}
ρs1': Valuation
Xfr1: svar
HeqXfr1: Xu = fresh_svar phi^[evar:dbi↦patt_free_evar y]
Heqρs1': ρs1' = update_svar_val Xu x0 ρ
ρs2': Valuation
Heqρs2': ρs2' = update_svar_val Xu x0 ρ
HeqHoc: bevar_occur phi dbi = true
HXfr1Fresh: svar_is_fresh_in Xu phi^[evar:dbi↦patt_free_evar y]
Hsub: is_subformula_of_ind (patt_free_evar y) phi^[evar:dbi↦patt_free_evar y]
HXfr1Fresh2: svar_is_fresh_in Xu (patt_free_evar y)
HXu: Xfr1 = Xu

eval ρs1' phi^{svar:0↦Xu}^[evar:dbi↦patt_free_evar y] = eval (update_svar_val Xu x0 ρ') phi'^{svar:0↦Xu}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
phi': Pattern
Heqphi': phi' = phi^{evar:dbi↦x}
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi'
Xu: svar
HeqXu: Xu = svar_fresh (elements (free_svars phi'))
ρ': Valuation
Heqρ': ρ' = update_evar_val x (evar_valuation ρ y) ρ
Hfresh_subst: svar_is_fresh_in Xfr' phi' → svar_is_fresh_in Xu phi' → eval (update_svar_val Xfr' x0 ρ') phi'^{svar:0↦Xfr'} = eval (update_svar_val Xu x0 ρ') phi'^{svar:0↦Xu}
ρs1': Valuation
Xfr1: svar
HeqXfr1: Xu = fresh_svar phi^[evar:dbi↦patt_free_evar y]
Heqρs1': ρs1' = update_svar_val Xu x0 ρ
ρs2': Valuation
Heqρs2': ρs2' = update_svar_val Xu x0 ρ
HeqHoc: bevar_occur phi dbi = true
HXfr1Fresh: svar_is_fresh_in Xu phi^[evar:dbi↦patt_free_evar y]
Hsub: is_subformula_of_ind (patt_free_evar y) phi^[evar:dbi↦patt_free_evar y]
HXfr1Fresh2: svar_is_fresh_in Xu (patt_free_evar y)
HXu: Xfr1 = Xu

eval ρs2' phi^{svar:0↦Xu}^[evar:dbi↦patt_free_evar y] = eval (update_svar_val Xu x0 ρ') phi'^{svar:0↦Xu}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
phi': Pattern
Heqphi': phi' = phi^{evar:dbi↦x}
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi'
Xu: svar
HeqXu: Xu = svar_fresh (elements (free_svars phi'))
ρ': Valuation
Heqρ': ρ' = update_evar_val x (evar_valuation ρ y) ρ
Hfresh_subst: svar_is_fresh_in Xfr' phi' → svar_is_fresh_in Xu phi' → eval (update_svar_val Xfr' x0 ρ') phi'^{svar:0↦Xfr'} = eval (update_svar_val Xu x0 ρ') phi'^{svar:0↦Xu}
ρs1': Valuation
Xfr1: svar
HeqXfr1: Xu = fresh_svar phi^[evar:dbi↦patt_free_evar y]
Heqρs1': ρs1' = update_svar_val Xu x0 ρ
ρs2': Valuation
Heqρs2': ρs2' = update_svar_val Xu x0 ρ
HeqHoc: bevar_occur phi dbi = true
HXfr1Fresh: svar_is_fresh_in Xu phi^[evar:dbi↦patt_free_evar y]
Hsub: is_subformula_of_ind (patt_free_evar y) phi^[evar:dbi↦patt_free_evar y]
HXfr1Fresh2: svar_is_fresh_in Xu (patt_free_evar y)
HXu: Xfr1 = Xu
ρs2' = ρs1'
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
phi': Pattern
Heqphi': phi' = phi^{evar:dbi↦x}
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi'
Xu: svar
HeqXu: Xu = svar_fresh (elements (free_svars phi'))
ρ': Valuation
Heqρ': ρ' = update_evar_val x (evar_valuation ρ y) ρ
Hfresh_subst: svar_is_fresh_in Xfr' phi' → svar_is_fresh_in Xu phi' → eval (update_svar_val Xfr' x0 ρ') phi'^{svar:0↦Xfr'} = eval (update_svar_val Xu x0 ρ') phi'^{svar:0↦Xu}
ρs1': Valuation
Xfr1: svar
HeqXfr1: Xu = fresh_svar phi^[evar:dbi↦patt_free_evar y]
Heqρs1': ρs1' = update_svar_val Xu x0 ρ
ρs2': Valuation
Heqρs2': ρs2' = update_svar_val Xu x0 ρ
HeqHoc: bevar_occur phi dbi = true
HXfr1Fresh: svar_is_fresh_in Xu phi^[evar:dbi↦patt_free_evar y]
Hsub: is_subformula_of_ind (patt_free_evar y) phi^[evar:dbi↦patt_free_evar y]
HXfr1Fresh2: svar_is_fresh_in Xu (patt_free_evar y)
HXu: Xfr1 = Xu

ρs2' = ρs1'
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
Hfresh_subst: svar_is_fresh_in (fresh_svar phi^{evar:dbi↦x}) phi^{evar:dbi↦x} → svar_is_fresh_in (svar_fresh (elements (free_svars phi^{evar:dbi↦x}))) phi^{evar:dbi↦x} → eval (update_svar_val (fresh_svar phi^{evar:dbi↦x}) x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi^{evar:dbi↦x}^{svar:0↦ fresh_svar phi^{evar:dbi↦x}} = eval (update_svar_val (svar_fresh (elements (free_svars phi^{evar:dbi↦x}))) x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi^{evar:dbi↦x}^{svar:0↦ svar_fresh (elements (free_svars phi^{evar:dbi↦x}))}
HeqXfr1: svar_fresh (elements (free_svars phi^{evar:dbi↦x})) = fresh_svar phi^[evar:dbi↦patt_free_evar y]
HeqHoc: bevar_occur phi dbi = true
HXfr1Fresh: svar_is_fresh_in (svar_fresh (elements (free_svars phi^{evar:dbi↦x}))) phi^[evar:dbi↦patt_free_evar y]
Hsub: is_subformula_of_ind (patt_free_evar y) phi^[evar:dbi↦patt_free_evar y]
HXfr1Fresh2: svar_is_fresh_in (svar_fresh (elements (free_svars phi^{evar:dbi↦x}))) (patt_free_evar y)

update_svar_val (svar_fresh (elements (free_svars phi^{evar:dbi↦x}))) x0 ρ = update_svar_val (svar_fresh (elements (free_svars phi^{evar:dbi↦x}))) x0 ρ
reflexivity.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
phi': Pattern
Heqphi': phi' = phi^{evar:dbi↦x}
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi'
Xu: svar
HeqXu: Xu = svar_fresh (elements (free_svars phi'))
ρ': Valuation
Heqρ': ρ' = update_evar_val x (evar_valuation ρ y) ρ
Hfresh_subst: svar_is_fresh_in Xfr' phi' → svar_is_fresh_in Xu phi' → eval (update_svar_val Xfr' x0 ρ') phi'^{svar:0↦Xfr'} = eval (update_svar_val Xu x0 ρ') phi'^{svar:0↦Xu}
ρs1': Valuation
Xfr1: svar
HeqXfr1: Xu = fresh_svar phi^[evar:dbi↦patt_free_evar y]
Heqρs1': ρs1' = update_svar_val Xu x0 ρ
ρs2': Valuation
Heqρs2': ρs2' = update_svar_val Xu x0 ρ
HeqHoc: bevar_occur phi dbi = true
HXfr1Fresh: svar_is_fresh_in Xu phi^[evar:dbi↦patt_free_evar y]
Hsub: is_subformula_of_ind (patt_free_evar y) phi^[evar:dbi↦patt_free_evar y]
HXfr1Fresh2: svar_is_fresh_in Xu (patt_free_evar y)
HXu: Xfr1 = Xu

eval ρs2' phi^{svar:0↦Xu}^[evar:dbi↦patt_free_evar y] = eval (update_svar_val Xu x0 ρ') phi'^{svar:0↦Xu}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
phi': Pattern
Heqphi': phi' = phi^{evar:dbi↦x}
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi'
Xu: svar
HeqXu: Xu = svar_fresh (elements (free_svars phi'))
Hfresh_subst: svar_is_fresh_in Xfr' phi' → svar_is_fresh_in Xu phi' → eval (update_svar_val Xfr' x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi'^{svar:0↦Xfr'} = eval (update_svar_val Xu x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi'^{svar:0↦Xu}
ρs1': Valuation
Xfr1: svar
HeqXfr1: Xu = fresh_svar phi^[evar:dbi↦patt_free_evar y]
Heqρs1': ρs1' = update_svar_val Xu x0 ρ
HeqHoc: bevar_occur phi dbi = true
HXfr1Fresh: svar_is_fresh_in Xu phi^[evar:dbi↦patt_free_evar y]
Hsub: is_subformula_of_ind (patt_free_evar y) phi^[evar:dbi↦patt_free_evar y]
HXfr1Fresh2: svar_is_fresh_in Xu (patt_free_evar y)
HXu: Xfr1 = Xu

eval (update_svar_val Xu x0 ρ) phi^{svar:0↦Xu}^[evar:dbi↦patt_free_evar y] = eval (update_svar_val Xu x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi'^{svar:0↦Xu}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
phi': Pattern
Heqphi': phi' = phi^{evar:dbi↦x}
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi'
Xu: svar
HeqXu: Xu = svar_fresh (elements (free_svars phi'))
Hfresh_subst: svar_is_fresh_in Xfr' phi' → svar_is_fresh_in Xu phi' → eval (update_svar_val Xfr' x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi'^{svar:0↦Xfr'} = eval (update_svar_val Xu x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi'^{svar:0↦Xu}
ρs1': Valuation
Xfr1: svar
HeqXfr1: Xu = fresh_svar phi^[evar:dbi↦patt_free_evar y]
Heqρs1': ρs1' = update_svar_val Xu x0 ρ
HeqHoc: bevar_occur phi dbi = true
HXfr1Fresh: svar_is_fresh_in Xu phi^[evar:dbi↦patt_free_evar y]
Hsub: is_subformula_of_ind (patt_free_evar y) phi^[evar:dbi↦patt_free_evar y]
HXfr1Fresh2: svar_is_fresh_in Xu (patt_free_evar y)
HXu: Xfr1 = Xu

update_svar_val Xu x0 ρs1' = update_svar_val Xu x0 ρ
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
phi': Pattern
Heqphi': phi' = phi^{evar:dbi↦x}
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi'
Xu: svar
HeqXu: Xu = svar_fresh (elements (free_svars phi'))
Hfresh_subst: svar_is_fresh_in Xfr' phi' → svar_is_fresh_in Xu phi' → eval (update_svar_val Xfr' x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi'^{svar:0↦Xfr'} = eval (update_svar_val Xu x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi'^{svar:0↦Xu}
ρs1': Valuation
Xfr1: svar
HeqXfr1: Xu = fresh_svar phi^[evar:dbi↦patt_free_evar y]
Heqρs1': ρs1' = update_svar_val Xu x0 ρ
HeqHoc: bevar_occur phi dbi = true
HXfr1Fresh: svar_is_fresh_in Xu phi^[evar:dbi↦patt_free_evar y]
Hsub: is_subformula_of_ind (patt_free_evar y) phi^[evar:dbi↦patt_free_evar y]
HXfr1Fresh2: svar_is_fresh_in Xu (patt_free_evar y)
HXu: Xfr1 = Xu
Hs1s1': update_svar_val Xu x0 ρs1' = update_svar_val Xu x0 ρ
eval (update_svar_val Xu x0 ρ) phi^{svar:0↦Xu}^[evar:dbi↦ patt_free_evar y] = eval (update_svar_val Xu x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi'^{svar:0↦Xu}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
phi': Pattern
Heqphi': phi' = phi^{evar:dbi↦x}
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi'
Xu: svar
HeqXu: Xu = svar_fresh (elements (free_svars phi'))
Hfresh_subst: svar_is_fresh_in Xfr' phi' → svar_is_fresh_in Xu phi' → eval (update_svar_val Xfr' x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi'^{svar:0↦Xfr'} = eval (update_svar_val Xu x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi'^{svar:0↦Xu}
ρs1': Valuation
Xfr1: svar
HeqXfr1: Xu = fresh_svar phi^[evar:dbi↦patt_free_evar y]
Heqρs1': ρs1' = update_svar_val Xu x0 ρ
HeqHoc: bevar_occur phi dbi = true
HXfr1Fresh: svar_is_fresh_in Xu phi^[evar:dbi↦patt_free_evar y]
Hsub: is_subformula_of_ind (patt_free_evar y) phi^[evar:dbi↦patt_free_evar y]
HXfr1Fresh2: svar_is_fresh_in Xu (patt_free_evar y)
HXu: Xfr1 = Xu

update_svar_val Xu x0 ρs1' = update_svar_val Xu x0 ρ
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
Hfresh_subst: svar_is_fresh_in (fresh_svar phi^{evar:dbi↦x}) phi^{evar:dbi↦x} → svar_is_fresh_in (svar_fresh (elements (free_svars phi^{evar:dbi↦x}))) phi^{evar:dbi↦x} → eval (update_svar_val (fresh_svar phi^{evar:dbi↦x}) x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi^{evar:dbi↦x}^{svar:0↦ fresh_svar phi^{evar:dbi↦x}} = eval (update_svar_val (svar_fresh (elements (free_svars phi^{evar:dbi↦x}))) x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi^{evar:dbi↦x}^{svar:0↦ svar_fresh (elements (free_svars phi^{evar:dbi↦x}))}
HeqXfr1: svar_fresh (elements (free_svars phi^{evar:dbi↦x})) = fresh_svar phi^[evar:dbi↦patt_free_evar y]
HeqHoc: bevar_occur phi dbi = true
HXfr1Fresh: svar_is_fresh_in (svar_fresh (elements (free_svars phi^{evar:dbi↦x}))) phi^[evar:dbi↦patt_free_evar y]
Hsub: is_subformula_of_ind (patt_free_evar y) phi^[evar:dbi↦patt_free_evar y]
HXfr1Fresh2: svar_is_fresh_in (svar_fresh (elements (free_svars phi^{evar:dbi↦x}))) (patt_free_evar y)

update_svar_val (svar_fresh (elements (free_svars phi^{evar:dbi↦x}))) x0 (update_svar_val (svar_fresh (elements (free_svars phi^{evar:dbi↦x}))) x0 ρ) = update_svar_val (svar_fresh (elements (free_svars phi^{evar:dbi↦x}))) x0 ρ
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
Hfresh_subst: svar_is_fresh_in (fresh_svar phi^{evar:dbi↦x}) phi^{evar:dbi↦x} → svar_is_fresh_in (svar_fresh (elements (free_svars phi^{evar:dbi↦x}))) phi^{evar:dbi↦x} → eval (update_svar_val (fresh_svar phi^{evar:dbi↦x}) x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi^{evar:dbi↦x}^{svar:0↦ fresh_svar phi^{evar:dbi↦x}} = eval (update_svar_val (svar_fresh (elements (free_svars phi^{evar:dbi↦x}))) x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi^{evar:dbi↦x}^{svar:0↦ svar_fresh (elements (free_svars phi^{evar:dbi↦x}))}
HeqXfr1: svar_fresh (elements (free_svars phi^{evar:dbi↦x})) = fresh_svar phi^[evar:dbi↦patt_free_evar y]
HeqHoc: bevar_occur phi dbi = true
HXfr1Fresh: svar_is_fresh_in (svar_fresh (elements (free_svars phi^{evar:dbi↦x}))) phi^[evar:dbi↦patt_free_evar y]
Hsub: is_subformula_of_ind (patt_free_evar y) phi^[evar:dbi↦patt_free_evar y]
HXfr1Fresh2: svar_is_fresh_in (svar_fresh (elements (free_svars phi^{evar:dbi↦x}))) (patt_free_evar y)

update_svar_val (svar_fresh (elements (free_svars phi^{evar:dbi↦x}))) x0 ρ = update_svar_val (svar_fresh (elements (free_svars phi^{evar:dbi↦x}))) x0 ρ
reflexivity.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
phi': Pattern
Heqphi': phi' = phi^{evar:dbi↦x}
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi'
Xu: svar
HeqXu: Xu = svar_fresh (elements (free_svars phi'))
Hfresh_subst: svar_is_fresh_in Xfr' phi' → svar_is_fresh_in Xu phi' → eval (update_svar_val Xfr' x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi'^{svar:0↦Xfr'} = eval (update_svar_val Xu x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi'^{svar:0↦Xu}
ρs1': Valuation
Xfr1: svar
HeqXfr1: Xu = fresh_svar phi^[evar:dbi↦patt_free_evar y]
Heqρs1': ρs1' = update_svar_val Xu x0 ρ
HeqHoc: bevar_occur phi dbi = true
HXfr1Fresh: svar_is_fresh_in Xu phi^[evar:dbi↦patt_free_evar y]
Hsub: is_subformula_of_ind (patt_free_evar y) phi^[evar:dbi↦patt_free_evar y]
HXfr1Fresh2: svar_is_fresh_in Xu (patt_free_evar y)
HXu: Xfr1 = Xu
Hs1s1': update_svar_val Xu x0 ρs1' = update_svar_val Xu x0 ρ

eval (update_svar_val Xu x0 ρ) phi^{svar:0↦Xu}^[evar:dbi↦patt_free_evar y] = eval (update_svar_val Xu x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi'^{svar:0↦Xu}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi^{evar:dbi↦x}
Xu: svar
Hfresh_subst: svar_is_fresh_in Xfr' phi^{evar:dbi↦x} → svar_is_fresh_in Xu phi^{evar:dbi↦x} → eval (update_svar_val Xfr' x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi^{evar:dbi↦x}^{svar:0↦Xfr'} = eval (update_svar_val Xu x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi^{evar:dbi↦x}^{svar:0↦Xu}
HeqXu: Xu = svar_fresh (elements (free_svars phi^{evar:dbi↦x}))
ρs1': Valuation
Xfr1: svar
HeqXfr1: Xu = fresh_svar phi^[evar:dbi↦patt_free_evar y]
Heqρs1': ρs1' = update_svar_val Xu x0 ρ
HeqHoc: bevar_occur phi dbi = true
HXfr1Fresh: svar_is_fresh_in Xu phi^[evar:dbi↦patt_free_evar y]
Hsub: is_subformula_of_ind (patt_free_evar y) phi^[evar:dbi↦patt_free_evar y]
HXfr1Fresh2: svar_is_fresh_in Xu (patt_free_evar y)
HXu: Xfr1 = Xu
Hs1s1': update_svar_val Xu x0 ρs1' = update_svar_val Xu x0 ρ

eval (update_svar_val Xu x0 ρ) phi^{svar:0↦Xu}^[evar:dbi↦patt_free_evar y] = eval (update_svar_val Xu x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi^{evar:dbi↦x}^{svar:0↦Xu}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi^{evar:dbi↦x}
Xu: svar
Hfresh_subst: svar_is_fresh_in Xfr' phi^{evar:dbi↦x} → svar_is_fresh_in Xu phi^{evar:dbi↦x} → eval (update_svar_val Xfr' x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi^{evar:dbi↦x}^{svar:0↦Xfr'} = eval (update_svar_val Xu x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi^{evar:dbi↦x}^{svar:0↦Xu}
HeqXu: Xu = svar_fresh (elements (free_svars phi^{evar:dbi↦x}))
ρs1': Valuation
Xfr1: svar
HeqXfr1: Xu = fresh_svar phi^[evar:dbi↦patt_free_evar y]
Heqρs1': ρs1' = update_svar_val Xu x0 ρ
HeqHoc: bevar_occur phi dbi = true
HXfr1Fresh: svar_is_fresh_in Xu phi^[evar:dbi↦patt_free_evar y]
Hsub: is_subformula_of_ind (patt_free_evar y) phi^[evar:dbi↦patt_free_evar y]
HXfr1Fresh2: svar_is_fresh_in Xu (patt_free_evar y)
HXu: Xfr1 = Xu
Hs1s1': update_svar_val Xu x0 ρs1' = update_svar_val Xu x0 ρ

eval (update_svar_val Xu x0 ρ) phi^{svar:0↦Xu}^[evar:dbi↦patt_free_evar y] = eval (update_svar_val Xu x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi^{svar:0↦Xu}^{evar:dbi↦x}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi^{evar:dbi↦x}
Xu: svar
Hfresh_subst: svar_is_fresh_in Xfr' phi^{evar:dbi↦x} → svar_is_fresh_in Xu phi^{evar:dbi↦x} → eval (update_svar_val Xfr' x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi^{evar:dbi↦x}^{svar:0↦Xfr'} = eval (update_svar_val Xu x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi^{evar:dbi↦x}^{svar:0↦Xu}
HeqXu: Xu = svar_fresh (elements (free_svars phi^{evar:dbi↦x}))
ρs1': Valuation
Xfr1: svar
HeqXfr1: Xu = fresh_svar phi^[evar:dbi↦patt_free_evar y]
Heqρs1': ρs1' = update_svar_val Xu x0 ρ
HeqHoc: bevar_occur phi dbi = true
HXfr1Fresh: svar_is_fresh_in Xu phi^[evar:dbi↦patt_free_evar y]
Hsub: is_subformula_of_ind (patt_free_evar y) phi^[evar:dbi↦patt_free_evar y]
HXfr1Fresh2: svar_is_fresh_in Xu (patt_free_evar y)
HXu: Xfr1 = Xu
Hs1s1': update_svar_val Xu x0 ρs1' = update_svar_val Xu x0 ρ

eval (update_svar_val Xu x0 ρ) phi^{svar:0↦Xu}^[evar:dbi↦patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) (update_svar_val Xu x0 ρ)) phi^{svar:0↦Xu}^{evar:dbi↦x}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi^{evar:dbi↦x}
Xu: svar
Hfresh_subst: svar_is_fresh_in Xfr' phi^{evar:dbi↦x} → svar_is_fresh_in Xu phi^{evar:dbi↦x} → eval (update_svar_val Xfr' x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi^{evar:dbi↦x}^{svar:0↦Xfr'} = eval (update_svar_val Xu x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi^{evar:dbi↦x}^{svar:0↦Xu}
HeqXu: Xu = svar_fresh (elements (free_svars phi^{evar:dbi↦x}))
ρs1': Valuation
HeqXfr1: Xu = fresh_svar phi^[evar:dbi↦patt_free_evar y]
Heqρs1': ρs1' = update_svar_val Xu x0 ρ
HeqHoc: bevar_occur phi dbi = true
HXfr1Fresh: svar_is_fresh_in Xu phi^[evar:dbi↦patt_free_evar y]
Hsub: is_subformula_of_ind (patt_free_evar y) phi^[evar:dbi↦patt_free_evar y]
HXfr1Fresh2: svar_is_fresh_in Xu (patt_free_evar y)
Hs1s1': update_svar_val Xu x0 ρs1' = update_svar_val Xu x0 ρ

eval (update_svar_val Xu x0 ρ) phi^{svar:0↦Xu}^[evar:dbi↦patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) (update_svar_val Xu x0 ρ)) phi^{svar:0↦Xu}^{evar:dbi↦x}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi^{evar:dbi↦x}
Xu: svar
Hfresh_subst: svar_is_fresh_in Xfr' phi^{evar:dbi↦x} → svar_is_fresh_in Xu phi^{evar:dbi↦x} → eval (update_svar_val Xfr' x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi^{evar:dbi↦x}^{svar:0↦Xfr'} = eval (update_svar_val Xu x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi^{evar:dbi↦x}^{svar:0↦Xu}
HeqXu: Xu = svar_fresh (elements (free_svars phi^{evar:dbi↦x}))
HeqXfr1: Xu = fresh_svar phi^[evar:dbi↦patt_free_evar y]
HeqHoc: bevar_occur phi dbi = true
HXfr1Fresh: svar_is_fresh_in Xu phi^[evar:dbi↦patt_free_evar y]
Hsub: is_subformula_of_ind (patt_free_evar y) phi^[evar:dbi↦patt_free_evar y]
HXfr1Fresh2: svar_is_fresh_in Xu (patt_free_evar y)
Hs1s1': update_svar_val Xu x0 (update_svar_val Xu x0 ρ) = update_svar_val Xu x0 ρ

eval (update_svar_val Xu x0 ρ) phi^{svar:0↦Xu}^[evar:dbi↦patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) (update_svar_val Xu x0 ρ)) phi^{svar:0↦Xu}^{evar:dbi↦x}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi^{evar:dbi↦x}
Xu: svar
Hfresh_subst: svar_is_fresh_in Xfr' phi^{evar:dbi↦x} → svar_is_fresh_in Xu phi^{evar:dbi↦x} → eval (update_svar_val Xfr' x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi^{evar:dbi↦x}^{svar:0↦Xfr'} = eval (update_svar_val Xu x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi^{evar:dbi↦x}^{svar:0↦Xu}
HeqXu: Xu = svar_fresh (elements (free_svars phi^{evar:dbi↦x}))
HeqXfr1: Xu = fresh_svar phi^[evar:dbi↦patt_free_evar y]
HeqHoc: bevar_occur phi dbi = true
HXfr1Fresh: svar_is_fresh_in Xu phi^[evar:dbi↦patt_free_evar y]
Hsub: is_subformula_of_ind (patt_free_evar y) phi^[evar:dbi↦patt_free_evar y]
HXfr1Fresh2: svar_is_fresh_in Xu (patt_free_evar y)
Hs1s1': update_svar_val Xu x0 (update_svar_val Xu x0 ρ) = update_svar_val Xu x0 ρ

eval (update_svar_val Xu x0 ρ) phi^{svar:0↦Xu}^[evar:dbi↦patt_free_evar y] = eval (update_evar_val x (evar_valuation (update_svar_val Xu x0 ρ) y) (update_svar_val Xu x0 ρ)) phi^{svar:0↦Xu}^{evar:dbi↦x}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi^{evar:dbi↦x}
Xu: svar
Hfresh_subst: svar_is_fresh_in Xfr' phi^{evar:dbi↦x} → svar_is_fresh_in Xu phi^{evar:dbi↦x} → eval (update_svar_val Xfr' x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi^{evar:dbi↦x}^{svar:0↦Xfr'} = eval (update_svar_val Xu x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi^{evar:dbi↦x}^{svar:0↦Xu}
HeqXu: Xu = svar_fresh (elements (free_svars phi^{evar:dbi↦x}))
HeqXfr1: Xu = fresh_svar phi^[evar:dbi↦patt_free_evar y]
HeqHoc: bevar_occur phi dbi = true
HXfr1Fresh: svar_is_fresh_in Xu phi^[evar:dbi↦patt_free_evar y]
Hsub: is_subformula_of_ind (patt_free_evar y) phi^[evar:dbi↦patt_free_evar y]
HXfr1Fresh2: svar_is_fresh_in Xu (patt_free_evar y)
Hs1s1': update_svar_val Xu x0 (update_svar_val Xu x0 ρ) = update_svar_val Xu x0 ρ
evar_valuation (update_svar_val Xu x0 ρ) y = evar_valuation ρ y
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi^{evar:dbi↦x}
Xu: svar
Hfresh_subst: svar_is_fresh_in Xfr' phi^{evar:dbi↦x} → svar_is_fresh_in Xu phi^{evar:dbi↦x} → eval (update_svar_val Xfr' x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi^{evar:dbi↦x}^{svar:0↦Xfr'} = eval (update_svar_val Xu x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi^{evar:dbi↦x}^{svar:0↦Xu}
HeqXu: Xu = svar_fresh (elements (free_svars phi^{evar:dbi↦x}))
HeqXfr1: Xu = fresh_svar phi^[evar:dbi↦patt_free_evar y]
HeqHoc: bevar_occur phi dbi = true
HXfr1Fresh: svar_is_fresh_in Xu phi^[evar:dbi↦patt_free_evar y]
Hsub: is_subformula_of_ind (patt_free_evar y) phi^[evar:dbi↦patt_free_evar y]
HXfr1Fresh2: svar_is_fresh_in Xu (patt_free_evar y)
Hs1s1': update_svar_val Xu x0 (update_svar_val Xu x0 ρ) = update_svar_val Xu x0 ρ

evar_valuation (update_svar_val Xu x0 ρ) y = evar_valuation ρ y
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρₑ: evar → M
ρₛ: svar → propset M
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi^{evar:dbi↦x}
Xu: svar
Hfresh_subst: svar_is_fresh_in Xfr' phi^{evar:dbi↦x} → svar_is_fresh_in Xu phi^{evar:dbi↦x} → eval (update_svar_val Xfr' x0 (update_evar_val x (evar_valuation {| evar_valuation := ρₑ; svar_valuation := ρₛ |} y) {| evar_valuation := ρₑ; svar_valuation := ρₛ |})) phi^{evar:dbi↦x}^{svar:0↦Xfr'} = eval (update_svar_val Xu x0 (update_evar_val x (evar_valuation {| evar_valuation := ρₑ; svar_valuation := ρₛ |} y) {| evar_valuation := ρₑ; svar_valuation := ρₛ |})) phi^{evar:dbi↦x}^{svar:0↦Xu}
HeqXu: Xu = svar_fresh (elements (free_svars phi^{evar:dbi↦x}))
HeqXfr1: Xu = fresh_svar phi^[evar:dbi↦patt_free_evar y]
HeqHoc: bevar_occur phi dbi = true
HXfr1Fresh: svar_is_fresh_in Xu phi^[evar:dbi↦patt_free_evar y]
Hsub: is_subformula_of_ind (patt_free_evar y) phi^[evar:dbi↦patt_free_evar y]
HXfr1Fresh2: svar_is_fresh_in Xu (patt_free_evar y)
Hs1s1': update_svar_val Xu x0 (update_svar_val Xu x0 {| evar_valuation := ρₑ; svar_valuation := ρₛ |}) = update_svar_val Xu x0 {| evar_valuation := ρₑ; svar_valuation := ρₛ |}

evar_valuation (update_svar_val Xu x0 {| evar_valuation := ρₑ; svar_valuation := ρₛ |}) y = evar_valuation {| evar_valuation := ρₑ; svar_valuation := ρₛ |} y
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρₑ: evar → M
ρₛ: svar → propset M
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi^{evar:dbi↦x}
Xu: svar
Hfresh_subst: svar_is_fresh_in Xfr' phi^{evar:dbi↦x} → svar_is_fresh_in Xu phi^{evar:dbi↦x} → eval (update_svar_val Xfr' x0 (update_evar_val x (evar_valuation {| evar_valuation := ρₑ; svar_valuation := ρₛ |} y) {| evar_valuation := ρₑ; svar_valuation := ρₛ |})) phi^{evar:dbi↦x}^{svar:0↦Xfr'} = eval (update_svar_val Xu x0 (update_evar_val x (evar_valuation {| evar_valuation := ρₑ; svar_valuation := ρₛ |} y) {| evar_valuation := ρₑ; svar_valuation := ρₛ |})) phi^{evar:dbi↦x}^{svar:0↦Xu}
HeqXu: Xu = svar_fresh (elements (free_svars phi^{evar:dbi↦x}))
HeqXfr1: Xu = fresh_svar phi^[evar:dbi↦patt_free_evar y]
HeqHoc: bevar_occur phi dbi = true
HXfr1Fresh: svar_is_fresh_in Xu phi^[evar:dbi↦patt_free_evar y]
Hsub: is_subformula_of_ind (patt_free_evar y) phi^[evar:dbi↦patt_free_evar y]
HXfr1Fresh2: svar_is_fresh_in Xu (patt_free_evar y)
Hs1s1': update_svar_val Xu x0 (update_svar_val Xu x0 {| evar_valuation := ρₑ; svar_valuation := ρₛ |}) = update_svar_val Xu x0 {| evar_valuation := ρₑ; svar_valuation := ρₛ |}

ρₑ y = ρₑ y
reflexivity.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi^{evar:dbi↦x}
Xu: svar
Hfresh_subst: svar_is_fresh_in Xfr' phi^{evar:dbi↦x} → svar_is_fresh_in Xu phi^{evar:dbi↦x} → eval (update_svar_val Xfr' x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi^{evar:dbi↦x}^{svar:0↦Xfr'} = eval (update_svar_val Xu x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi^{evar:dbi↦x}^{svar:0↦Xu}
HeqXu: Xu = svar_fresh (elements (free_svars phi^{evar:dbi↦x}))
HeqXfr1: Xu = fresh_svar phi^[evar:dbi↦patt_free_evar y]
HeqHoc: bevar_occur phi dbi = true
HXfr1Fresh: svar_is_fresh_in Xu phi^[evar:dbi↦patt_free_evar y]
Hsub: is_subformula_of_ind (patt_free_evar y) phi^[evar:dbi↦patt_free_evar y]
HXfr1Fresh2: svar_is_fresh_in Xu (patt_free_evar y)
Hs1s1': update_svar_val Xu x0 (update_svar_val Xu x0 ρ) = update_svar_val Xu x0 ρ

eval (update_svar_val Xu x0 ρ) phi^{svar:0↦Xu}^[evar:dbi↦patt_free_evar y] = eval (update_evar_val x (evar_valuation (update_svar_val Xu x0 ρ) y) (update_svar_val Xu x0 ρ)) phi^{svar:0↦Xu}^{evar:dbi↦x}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi^{evar:dbi↦x}
Xu: svar
Hfresh_subst: svar_is_fresh_in Xfr' phi^{evar:dbi↦x} → svar_is_fresh_in Xu phi^{evar:dbi↦x} → eval (update_svar_val Xfr' x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi^{evar:dbi↦x}^{svar:0↦Xfr'} = eval (update_svar_val Xu x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi^{evar:dbi↦x}^{svar:0↦Xu}
HeqXu: Xu = svar_fresh (elements (free_svars phi^{evar:dbi↦x}))
HeqXfr1: Xu = fresh_svar phi^[evar:dbi↦patt_free_evar y]
HeqHoc: bevar_occur phi dbi = true
HXfr1Fresh: svar_is_fresh_in Xu phi^[evar:dbi↦patt_free_evar y]
Hsub: is_subformula_of_ind (patt_free_evar y) phi^[evar:dbi↦patt_free_evar y]
HXfr1Fresh2: svar_is_fresh_in Xu (patt_free_evar y)
Hs1s1': update_svar_val Xu x0 (update_svar_val Xu x0 ρ) = update_svar_val Xu x0 ρ

eval (update_svar_val Xu x0 ρ) phi^{svar:0↦Xu}^[evar:dbi↦patt_free_evar y] = eval (update_svar_val Xu x0 ρ) phi^{svar:0↦Xu}^[evar:dbi↦patt_free_evar y]
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi^{evar:dbi↦x}
Xu: svar
Hfresh_subst: svar_is_fresh_in Xfr' phi^{evar:dbi↦x} → svar_is_fresh_in Xu phi^{evar:dbi↦x} → eval (update_svar_val Xfr' x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi^{evar:dbi↦x}^{svar:0↦Xfr'} = eval (update_svar_val Xu x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi^{evar:dbi↦x}^{svar:0↦Xu}
HeqXu: Xu = svar_fresh (elements (free_svars phi^{evar:dbi↦x}))
HeqXfr1: Xu = fresh_svar phi^[evar:dbi↦patt_free_evar y]
HeqHoc: bevar_occur phi dbi = true
HXfr1Fresh: svar_is_fresh_in Xu phi^[evar:dbi↦patt_free_evar y]
Hsub: is_subformula_of_ind (patt_free_evar y) phi^[evar:dbi↦patt_free_evar y]
HXfr1Fresh2: svar_is_fresh_in Xu (patt_free_evar y)
Hs1s1': update_svar_val Xu x0 (update_svar_val Xu x0 ρ) = update_svar_val Xu x0 ρ
size phi^{svar:0↦Xu} ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi^{evar:dbi↦x}
Xu: svar
Hfresh_subst: svar_is_fresh_in Xfr' phi^{evar:dbi↦x} → svar_is_fresh_in Xu phi^{evar:dbi↦x} → eval (update_svar_val Xfr' x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi^{evar:dbi↦x}^{svar:0↦Xfr'} = eval (update_svar_val Xu x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi^{evar:dbi↦x}^{svar:0↦Xu}
HeqXu: Xu = svar_fresh (elements (free_svars phi^{evar:dbi↦x}))
HeqXfr1: Xu = fresh_svar phi^[evar:dbi↦patt_free_evar y]
HeqHoc: bevar_occur phi dbi = true
HXfr1Fresh: svar_is_fresh_in Xu phi^[evar:dbi↦patt_free_evar y]
Hsub: is_subformula_of_ind (patt_free_evar y) phi^[evar:dbi↦patt_free_evar y]
HXfr1Fresh2: svar_is_fresh_in Xu (patt_free_evar y)
Hs1s1': update_svar_val Xu x0 (update_svar_val Xu x0 ρ) = update_svar_val Xu x0 ρ
evar_is_fresh_in x phi^{svar:0↦Xu}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi^{evar:dbi↦x}
Xu: svar
Hfresh_subst: svar_is_fresh_in Xfr' phi^{evar:dbi↦x} → svar_is_fresh_in Xu phi^{evar:dbi↦x} → eval (update_svar_val Xfr' x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi^{evar:dbi↦x}^{svar:0↦Xfr'} = eval (update_svar_val Xu x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi^{evar:dbi↦x}^{svar:0↦Xu}
HeqXu: Xu = svar_fresh (elements (free_svars phi^{evar:dbi↦x}))
HeqXfr1: Xu = fresh_svar phi^[evar:dbi↦patt_free_evar y]
HeqHoc: bevar_occur phi dbi = true
HXfr1Fresh: svar_is_fresh_in Xu phi^[evar:dbi↦patt_free_evar y]
Hsub: is_subformula_of_ind (patt_free_evar y) phi^[evar:dbi↦patt_free_evar y]
HXfr1Fresh2: svar_is_fresh_in Xu (patt_free_evar y)
Hs1s1': update_svar_val Xu x0 (update_svar_val Xu x0 ρ) = update_svar_val Xu x0 ρ
well_formed_closed_ex_aux phi^{svar:0↦Xu} (S dbi)
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi^{evar:dbi↦x}
Xu: svar
Hfresh_subst: svar_is_fresh_in Xfr' phi^{evar:dbi↦x} → svar_is_fresh_in Xu phi^{evar:dbi↦x} → eval (update_svar_val Xfr' x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi^{evar:dbi↦x}^{svar:0↦Xfr'} = eval (update_svar_val Xu x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi^{evar:dbi↦x}^{svar:0↦Xu}
HeqXu: Xu = svar_fresh (elements (free_svars phi^{evar:dbi↦x}))
HeqXfr1: Xu = fresh_svar phi^[evar:dbi↦patt_free_evar y]
HeqHoc: bevar_occur phi dbi = true
HXfr1Fresh: svar_is_fresh_in Xu phi^[evar:dbi↦patt_free_evar y]
Hsub: is_subformula_of_ind (patt_free_evar y) phi^[evar:dbi↦patt_free_evar y]
HXfr1Fresh2: svar_is_fresh_in Xu (patt_free_evar y)
Hs1s1': update_svar_val Xu x0 (update_svar_val Xu x0 ρ) = update_svar_val Xu x0 ρ

eval (update_svar_val Xu x0 ρ) phi^{svar:0↦Xu}^[evar:dbi↦patt_free_evar y] = eval (update_svar_val Xu x0 ρ) phi^{svar:0↦Xu}^[evar:dbi↦patt_free_evar y]
reflexivity.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi^{evar:dbi↦x}
Xu: svar
Hfresh_subst: svar_is_fresh_in Xfr' phi^{evar:dbi↦x} → svar_is_fresh_in Xu phi^{evar:dbi↦x} → eval (update_svar_val Xfr' x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi^{evar:dbi↦x}^{svar:0↦Xfr'} = eval (update_svar_val Xu x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi^{evar:dbi↦x}^{svar:0↦Xu}
HeqXu: Xu = svar_fresh (elements (free_svars phi^{evar:dbi↦x}))
HeqXfr1: Xu = fresh_svar phi^[evar:dbi↦patt_free_evar y]
HeqHoc: bevar_occur phi dbi = true
HXfr1Fresh: svar_is_fresh_in Xu phi^[evar:dbi↦patt_free_evar y]
Hsub: is_subformula_of_ind (patt_free_evar y) phi^[evar:dbi↦patt_free_evar y]
HXfr1Fresh2: svar_is_fresh_in Xu (patt_free_evar y)
Hs1s1': update_svar_val Xu x0 (update_svar_val Xu x0 ρ) = update_svar_val Xu x0 ρ

size phi^{svar:0↦Xu} ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi^{evar:dbi↦x}
Xu: svar
Hfresh_subst: svar_is_fresh_in Xfr' phi^{evar:dbi↦x} → svar_is_fresh_in Xu phi^{evar:dbi↦x} → eval (update_svar_val Xfr' x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi^{evar:dbi↦x}^{svar:0↦Xfr'} = eval (update_svar_val Xu x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi^{evar:dbi↦x}^{svar:0↦Xu}
HeqXu: Xu = svar_fresh (elements (free_svars phi^{evar:dbi↦x}))
HeqXfr1: Xu = fresh_svar phi^[evar:dbi↦patt_free_evar y]
HeqHoc: bevar_occur phi dbi = true
HXfr1Fresh: svar_is_fresh_in Xu phi^[evar:dbi↦patt_free_evar y]
Hsub: is_subformula_of_ind (patt_free_evar y) phi^[evar:dbi↦patt_free_evar y]
HXfr1Fresh2: svar_is_fresh_in Xu (patt_free_evar y)
Hs1s1': update_svar_val Xu x0 (update_svar_val Xu x0 ρ) = update_svar_val Xu x0 ρ

size phi ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: S (size phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi^{evar:dbi↦x}
Xu: svar
Hfresh_subst: svar_is_fresh_in Xfr' phi^{evar:dbi↦x} → svar_is_fresh_in Xu phi^{evar:dbi↦x} → eval (update_svar_val Xfr' x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi^{evar:dbi↦x}^{svar:0↦Xfr'} = eval (update_svar_val Xu x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi^{evar:dbi↦x}^{svar:0↦Xu}
HeqXu: Xu = svar_fresh (elements (free_svars phi^{evar:dbi↦x}))
HeqXfr1: Xu = fresh_svar phi^[evar:dbi↦patt_free_evar y]
HeqHoc: bevar_occur phi dbi = true
HXfr1Fresh: svar_is_fresh_in Xu phi^[evar:dbi↦patt_free_evar y]
Hsub: is_subformula_of_ind (patt_free_evar y) phi^[evar:dbi↦patt_free_evar y]
HXfr1Fresh2: svar_is_fresh_in Xu (patt_free_evar y)
Hs1s1': update_svar_val Xu x0 (update_svar_val Xu x0 ρ) = update_svar_val Xu x0 ρ

size phi ≤ sz
lia.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi^{evar:dbi↦x}
Xu: svar
Hfresh_subst: svar_is_fresh_in Xfr' phi^{evar:dbi↦x} → svar_is_fresh_in Xu phi^{evar:dbi↦x} → eval (update_svar_val Xfr' x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi^{evar:dbi↦x}^{svar:0↦Xfr'} = eval (update_svar_val Xu x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi^{evar:dbi↦x}^{svar:0↦Xu}
HeqXu: Xu = svar_fresh (elements (free_svars phi^{evar:dbi↦x}))
HeqXfr1: Xu = fresh_svar phi^[evar:dbi↦patt_free_evar y]
HeqHoc: bevar_occur phi dbi = true
HXfr1Fresh: svar_is_fresh_in Xu phi^[evar:dbi↦patt_free_evar y]
Hsub: is_subformula_of_ind (patt_free_evar y) phi^[evar:dbi↦patt_free_evar y]
HXfr1Fresh2: svar_is_fresh_in Xu (patt_free_evar y)
Hs1s1': update_svar_val Xu x0 (update_svar_val Xu x0 ρ) = update_svar_val Xu x0 ρ

evar_is_fresh_in x phi^{svar:0↦Xu}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi^{evar:dbi↦x}
Xu: svar
Hfresh_subst: svar_is_fresh_in Xfr' phi^{evar:dbi↦x} → svar_is_fresh_in Xu phi^{evar:dbi↦x} → eval (update_svar_val Xfr' x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi^{evar:dbi↦x}^{svar:0↦Xfr'} = eval (update_svar_val Xu x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi^{evar:dbi↦x}^{svar:0↦Xu}
HeqXu: Xu = svar_fresh (elements (free_svars phi^{evar:dbi↦x}))
HeqXfr1: Xu = fresh_svar phi^[evar:dbi↦patt_free_evar y]
HeqHoc: bevar_occur phi dbi = true
HXfr1Fresh: svar_is_fresh_in Xu phi^[evar:dbi↦patt_free_evar y]
Hsub: is_subformula_of_ind (patt_free_evar y) phi^[evar:dbi↦patt_free_evar y]
HXfr1Fresh2: svar_is_fresh_in Xu (patt_free_evar y)
Hs1s1': update_svar_val Xu x0 (update_svar_val Xu x0 ρ) = update_svar_val Xu x0 ρ

evar_is_fresh_in x phi
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi^{evar:dbi↦x}
Xu: svar
Hfresh_subst: svar_is_fresh_in Xfr' phi^{evar:dbi↦x} → svar_is_fresh_in Xu phi^{evar:dbi↦x} → eval (update_svar_val Xfr' x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi^{evar:dbi↦x}^{svar:0↦Xfr'} = eval (update_svar_val Xu x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi^{evar:dbi↦x}^{svar:0↦Xu}
HeqXu: Xu = svar_fresh (elements (free_svars phi^{evar:dbi↦x}))
HeqXfr1: Xu = fresh_svar phi^[evar:dbi↦patt_free_evar y]
HeqHoc: bevar_occur phi dbi = true
HXfr1Fresh: svar_is_fresh_in Xu phi^[evar:dbi↦patt_free_evar y]
Hsub: is_subformula_of_ind (patt_free_evar y) phi^[evar:dbi↦patt_free_evar y]
HXfr1Fresh2: svar_is_fresh_in Xu (patt_free_evar y)
Hs1s1': update_svar_val Xu x0 (update_svar_val Xu x0 ρ) = update_svar_val Xu x0 ρ

evar_is_fresh_in x phi
apply H.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi^{evar:dbi↦x}
Xu: svar
Hfresh_subst: svar_is_fresh_in Xfr' phi^{evar:dbi↦x} → svar_is_fresh_in Xu phi^{evar:dbi↦x} → eval (update_svar_val Xfr' x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi^{evar:dbi↦x}^{svar:0↦Xfr'} = eval (update_svar_val Xu x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi^{evar:dbi↦x}^{svar:0↦Xu}
HeqXu: Xu = svar_fresh (elements (free_svars phi^{evar:dbi↦x}))
HeqXfr1: Xu = fresh_svar phi^[evar:dbi↦patt_free_evar y]
HeqHoc: bevar_occur phi dbi = true
HXfr1Fresh: svar_is_fresh_in Xu phi^[evar:dbi↦patt_free_evar y]
Hsub: is_subformula_of_ind (patt_free_evar y) phi^[evar:dbi↦patt_free_evar y]
HXfr1Fresh2: svar_is_fresh_in Xu (patt_free_evar y)
Hs1s1': update_svar_val Xu x0 (update_svar_val Xu x0 ρ) = update_svar_val Xu x0 ρ

well_formed_closed_ex_aux phi^{svar:0↦Xu} (S dbi)
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi^{evar:dbi↦x}
Xu: svar
Hfresh_subst: svar_is_fresh_in Xfr' phi^{evar:dbi↦x} → svar_is_fresh_in Xu phi^{evar:dbi↦x} → eval (update_svar_val Xfr' x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi^{evar:dbi↦x}^{svar:0↦Xfr'} = eval (update_svar_val Xu x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi^{evar:dbi↦x}^{svar:0↦Xu}
HeqXu: Xu = svar_fresh (elements (free_svars phi^{evar:dbi↦x}))
HeqXfr1: Xu = fresh_svar phi^[evar:dbi↦patt_free_evar y]
HeqHoc: bevar_occur phi dbi = true
HXfr1Fresh: svar_is_fresh_in Xu phi^[evar:dbi↦patt_free_evar y]
Hsub: is_subformula_of_ind (patt_free_evar y) phi^[evar:dbi↦patt_free_evar y]
HXfr1Fresh2: svar_is_fresh_in Xu (patt_free_evar y)
Hs1s1': update_svar_val Xu x0 (update_svar_val Xu x0 ρ) = update_svar_val Xu x0 ρ

well_formed_closed_ex_aux phi (S dbi) = true
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi^{evar:dbi↦x}
Xu: svar
Hfresh_subst: svar_is_fresh_in Xfr' phi^{evar:dbi↦x} → svar_is_fresh_in Xu phi^{evar:dbi↦x} → eval (update_svar_val Xfr' x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi^{evar:dbi↦x}^{svar:0↦Xfr'} = eval (update_svar_val Xu x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi^{evar:dbi↦x}^{svar:0↦Xu}
HeqXu: Xu = svar_fresh (elements (free_svars phi^{evar:dbi↦x}))
HeqXfr1: Xu = fresh_svar phi^[evar:dbi↦patt_free_evar y]
HeqHoc: bevar_occur phi dbi = true
HXfr1Fresh: svar_is_fresh_in Xu phi^[evar:dbi↦patt_free_evar y]
Hsub: is_subformula_of_ind (patt_free_evar y) phi^[evar:dbi↦patt_free_evar y]
HXfr1Fresh2: svar_is_fresh_in Xu (patt_free_evar y)
Hs1s1': update_svar_val Xu x0 (update_svar_val Xu x0 ρ) = update_svar_val Xu x0 ρ

?ind_evar1 ≤ S dbi
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi^{evar:dbi↦x}
Xu: svar
Hfresh_subst: svar_is_fresh_in Xfr' phi^{evar:dbi↦x} → svar_is_fresh_in Xu phi^{evar:dbi↦x} → eval (update_svar_val Xfr' x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi^{evar:dbi↦x}^{svar:0↦Xfr'} = eval (update_svar_val Xu x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi^{evar:dbi↦x}^{svar:0↦Xu}
HeqXu: Xu = svar_fresh (elements (free_svars phi^{evar:dbi↦x}))
HeqXfr1: Xu = fresh_svar phi^[evar:dbi↦patt_free_evar y]
HeqHoc: bevar_occur phi dbi = true
HXfr1Fresh: svar_is_fresh_in Xu phi^[evar:dbi↦patt_free_evar y]
Hsub: is_subformula_of_ind (patt_free_evar y) phi^[evar:dbi↦patt_free_evar y]
HXfr1Fresh2: svar_is_fresh_in Xu (patt_free_evar y)
Hs1s1': update_svar_val Xu x0 (update_svar_val Xu x0 ρ) = update_svar_val Xu x0 ρ
well_formed_closed_ex_aux phi ?ind_evar1 = true
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi^{evar:dbi↦x}
Xu: svar
Hfresh_subst: svar_is_fresh_in Xfr' phi^{evar:dbi↦x} → svar_is_fresh_in Xu phi^{evar:dbi↦x} → eval (update_svar_val Xfr' x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi^{evar:dbi↦x}^{svar:0↦Xfr'} = eval (update_svar_val Xu x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi^{evar:dbi↦x}^{svar:0↦Xu}
HeqXu: Xu = svar_fresh (elements (free_svars phi^{evar:dbi↦x}))
HeqXfr1: Xu = fresh_svar phi^[evar:dbi↦patt_free_evar y]
HeqHoc: bevar_occur phi dbi = true
HXfr1Fresh: svar_is_fresh_in Xu phi^[evar:dbi↦patt_free_evar y]
Hsub: is_subformula_of_ind (patt_free_evar y) phi^[evar:dbi↦patt_free_evar y]
HXfr1Fresh2: svar_is_fresh_in Xu (patt_free_evar y)
Hs1s1': update_svar_val Xu x0 (update_svar_val Xu x0 ρ) = update_svar_val Xu x0 ρ

S dbi ≤ S dbi
auto.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
phi': Pattern
Heqphi': phi' = phi^{evar:dbi↦x}
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi'
Xu: svar
HeqXu: Xu = svar_fresh (elements (free_svars phi'))
ρ': Valuation
Heqρ': ρ' = update_evar_val x (evar_valuation ρ y) ρ
Hfresh_subst: svar_is_fresh_in Xfr' phi' → svar_is_fresh_in Xu phi' → eval (update_svar_val Xfr' x0 ρ') phi'^{svar:0↦Xfr'} = eval (update_svar_val Xu x0 ρ') phi'^{svar:0↦Xu}
ρs1': Valuation
Xfr1: svar
HeqXfr1: Xfr1 = fresh_svar phi^[evar:dbi↦patt_free_evar y]
Heqρs1': ρs1' = update_svar_val Xfr1 x0 ρ
ρs2': Valuation
Heqρs2': ρs2' = update_svar_val Xu x0 ρ
HeqHoc: false = bevar_occur phi dbi

eval ρs1' phi^{svar:0↦Xfr1}^[evar:dbi↦patt_free_evar y] = eval (update_svar_val Xu x0 ρ') phi'^{svar:0↦Xu}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
phi': Pattern
Heqphi': phi' = phi^{evar:dbi↦x}
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi'
Xu: svar
HeqXu: Xu = svar_fresh (elements (free_svars phi'))
ρ': Valuation
Heqρ': ρ' = update_evar_val x (evar_valuation ρ y) ρ
Hfresh_subst: svar_is_fresh_in Xfr' phi' → svar_is_fresh_in Xu phi' → eval (update_svar_val Xfr' x0 ρ') phi'^{svar:0↦Xfr'} = eval (update_svar_val Xu x0 ρ') phi'^{svar:0↦Xu}
ρs1': Valuation
Xfr1: svar
HeqXfr1: Xfr1 = fresh_svar phi^[evar:dbi↦patt_free_evar y]
Heqρs1': ρs1' = update_svar_val Xfr1 x0 ρ
ρs2': Valuation
Heqρs2': ρs2' = update_svar_val Xu x0 ρ
HeqHoc, HeqHoc': false = bevar_occur phi dbi

eval ρs1' phi^{svar:0↦Xfr1}^[evar:dbi↦patt_free_evar y] = eval (update_svar_val Xu x0 ρ') phi'^{svar:0↦Xu}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
phi': Pattern
Heqphi': phi' = phi^{evar:dbi↦x}
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi'
Xu: svar
HeqXu: Xu = svar_fresh (elements (free_svars phi'))
ρ': Valuation
Heqρ': ρ' = update_evar_val x (evar_valuation ρ y) ρ
Hfresh_subst: svar_is_fresh_in Xfr' phi' → svar_is_fresh_in Xu phi' → eval (update_svar_val Xfr' x0 ρ') phi'^{svar:0↦Xfr'} = eval (update_svar_val Xu x0 ρ') phi'^{svar:0↦Xu}
ρs1': Valuation
Xfr1: svar
HeqXfr1: Xfr1 = fresh_svar phi^[evar:dbi↦patt_free_evar y]
Heqρs1': ρs1' = update_svar_val Xfr1 x0 ρ
ρs2': Valuation
Heqρs2': ρs2' = update_svar_val Xu x0 ρ
HeqHoc, HeqHoc': false = bevar_occur phi dbi

eval ρs1' phi^{svar:0↦Xfr1} = eval (update_svar_val Xu x0 ρ') phi'^{svar:0↦Xu}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
phi': Pattern
Heqphi': phi' = phi^{evar:dbi↦x}
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi'
Xu: svar
HeqXu: Xu = svar_fresh (elements (free_svars phi'))
ρ': Valuation
Heqρ': ρ' = update_evar_val x (evar_valuation ρ y) ρ
Hfresh_subst: svar_is_fresh_in Xfr' phi' → svar_is_fresh_in Xu phi' → eval (update_svar_val Xfr' x0 ρ') phi'^{svar:0↦Xfr'} = eval (update_svar_val Xu x0 ρ') phi'^{svar:0↦Xu}
ρs1': Valuation
Xfr1: svar
HeqXfr1: Xfr1 = fresh_svar phi^[evar:dbi↦patt_free_evar y]
Heqρs1': ρs1' = update_svar_val Xfr1 x0 ρ
ρs2': Valuation
Heqρs2': ρs2' = update_svar_val Xu x0 ρ
HeqHoc, HeqHoc': false = bevar_occur phi dbi
well_formed_closed_ex_aux phi^{svar:0↦Xfr1} dbi
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
phi': Pattern
Heqphi': phi' = phi^{evar:dbi↦x}
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi'
Xu: svar
HeqXu: Xu = svar_fresh (elements (free_svars phi'))
ρ': Valuation
Heqρ': ρ' = update_evar_val x (evar_valuation ρ y) ρ
Hfresh_subst: svar_is_fresh_in Xfr' phi' → svar_is_fresh_in Xu phi' → eval (update_svar_val Xfr' x0 ρ') phi'^{svar:0↦Xfr'} = eval (update_svar_val Xu x0 ρ') phi'^{svar:0↦Xu}
ρs1': Valuation
Xfr1: svar
HeqXfr1: Xfr1 = fresh_svar phi^[evar:dbi↦patt_free_evar y]
Heqρs1': ρs1' = update_svar_val Xfr1 x0 ρ
ρs2': Valuation
Heqρs2': ρs2' = update_svar_val Xu x0 ρ
HeqHoc, HeqHoc': false = bevar_occur phi dbi

well_formed_closed_ex_aux phi^{svar:0↦Xfr1} dbi
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
phi': Pattern
Heqphi': phi' = phi^{evar:dbi↦x}
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi'
Xu: svar
HeqXu: Xu = svar_fresh (elements (free_svars phi'))
ρ': Valuation
Heqρ': ρ' = update_evar_val x (evar_valuation ρ y) ρ
Hfresh_subst: svar_is_fresh_in Xfr' phi' → svar_is_fresh_in Xu phi' → eval (update_svar_val Xfr' x0 ρ') phi'^{svar:0↦Xfr'} = eval (update_svar_val Xu x0 ρ') phi'^{svar:0↦Xu}
ρs1': Valuation
Xfr1: svar
HeqXfr1: Xfr1 = fresh_svar phi^[evar:dbi↦patt_free_evar y]
Heqρs1': ρs1' = update_svar_val Xfr1 x0 ρ
ρs2': Valuation
Heqρs2': ρs2' = update_svar_val Xu x0 ρ
HeqHoc, HeqHoc': false = bevar_occur phi dbi

well_formed_closed_ex_aux phi dbi = true
apply wfc_ex_lower; wf_auto2.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
phi': Pattern
Heqphi': phi' = phi^{evar:dbi↦x}
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi'
Xu: svar
HeqXu: Xu = svar_fresh (elements (free_svars phi'))
ρ': Valuation
Heqρ': ρ' = update_evar_val x (evar_valuation ρ y) ρ
Hfresh_subst: svar_is_fresh_in Xfr' phi' → svar_is_fresh_in Xu phi' → eval (update_svar_val Xfr' x0 ρ') phi'^{svar:0↦Xfr'} = eval (update_svar_val Xu x0 ρ') phi'^{svar:0↦Xu}
ρs1': Valuation
Xfr1: svar
HeqXfr1: Xfr1 = fresh_svar phi^[evar:dbi↦patt_free_evar y]
Heqρs1': ρs1' = update_svar_val Xfr1 x0 ρ
ρs2': Valuation
Heqρs2': ρs2' = update_svar_val Xu x0 ρ
HeqHoc, HeqHoc': false = bevar_occur phi dbi

eval ρs1' phi^{svar:0↦Xfr1} = eval (update_svar_val Xu x0 ρ') phi'^{svar:0↦Xu}
(* Now svar_open does nothing to phi1, since it does not contain dbi (see HeqHoc). *) (* symmetry in HeqHoc. apply evar_open_not_occur with (x1:=x) in HeqHoc. *) (* X is not free in phi1, so the fact that in evar_val' it is updated to some value is irrelevant. *)
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
phi': Pattern
Heqphi': phi' = phi^{evar:dbi↦x}
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi'
Xu: svar
HeqXu: Xu = svar_fresh (elements (free_svars phi'))
Hfresh_subst: svar_is_fresh_in Xfr' phi' → svar_is_fresh_in Xu phi' → eval (update_svar_val Xfr' x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi'^{svar:0↦Xfr'} = eval (update_svar_val Xu x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi'^{svar:0↦Xu}
Xfr1: svar
HeqXfr1: Xfr1 = fresh_svar phi^[evar:dbi↦patt_free_evar y]
HeqHoc, HeqHoc': false = bevar_occur phi dbi

eval (update_svar_val Xfr1 x0 ρ) phi^{svar:0↦Xfr1} = eval (update_svar_val Xu x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi'^{svar:0↦Xu}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
phi': Pattern
Heqphi': phi' = phi^{evar:dbi↦x}
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi'
Xu: svar
HeqXu: Xu = svar_fresh (elements (free_svars phi'))
Hfresh_subst: svar_is_fresh_in Xfr' phi' → svar_is_fresh_in Xu phi' → eval (update_svar_val Xfr' x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi'^{svar:0↦Xfr'} = eval (update_svar_val Xu x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi'^{svar:0↦Xu}
Xfr1: svar
HeqXfr1: Xfr1 = fresh_svar phi^[evar:dbi↦patt_free_evar y]
HeqHoc, HeqHoc': false = bevar_occur phi dbi

eval (update_svar_val Xfr1 x0 ρ) phi^{svar:0↦Xfr1} = eval (update_svar_val Xu x0 ρ) phi'^{svar:0↦Xu}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
phi': Pattern
Heqphi': phi' = phi^{evar:dbi↦x}
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi'
Xu: svar
HeqXu: Xu = svar_fresh (elements (free_svars phi'))
Hfresh_subst: svar_is_fresh_in Xfr' phi' → svar_is_fresh_in Xu phi' → eval (update_svar_val Xfr' x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi'^{svar:0↦Xfr'} = eval (update_svar_val Xu x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi'^{svar:0↦Xu}
Xfr1: svar
HeqXfr1: Xfr1 = fresh_svar phi^[evar:dbi↦patt_free_evar y]
HeqHoc, HeqHoc': false = bevar_occur phi dbi
eval (update_svar_val Xu x0 ρ) phi'^{svar:0↦Xu} = eval (update_svar_val Xu x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi'^{svar:0↦Xu}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
phi': Pattern
Heqphi': phi' = phi^{evar:dbi↦x}
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi'
Xu: svar
HeqXu: Xu = svar_fresh (elements (free_svars phi'))
Hfresh_subst: svar_is_fresh_in Xfr' phi' → svar_is_fresh_in Xu phi' → eval (update_svar_val Xfr' x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi'^{svar:0↦Xfr'} = eval (update_svar_val Xu x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi'^{svar:0↦Xu}
Xfr1: svar
HeqXfr1: Xfr1 = fresh_svar phi^[evar:dbi↦patt_free_evar y]
HeqHoc, HeqHoc': false = bevar_occur phi dbi

eval (update_svar_val Xu x0 ρ) phi'^{svar:0↦Xu} = eval (update_svar_val Xu x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi'^{svar:0↦Xu}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
phi': Pattern
Heqphi': phi' = phi^{evar:dbi↦x}
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi'
Xu: svar
HeqXu: Xu = svar_fresh (elements (free_svars phi'))
Hfresh_subst: svar_is_fresh_in Xfr' phi' → svar_is_fresh_in Xu phi' → eval (update_svar_val Xfr' x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi'^{svar:0↦Xfr'} = eval (update_svar_val Xu x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi'^{svar:0↦Xu}
Xfr1: svar
HeqXfr1: Xfr1 = fresh_svar phi^[evar:dbi↦patt_free_evar y]
HeqHoc, HeqHoc': false = bevar_occur phi dbi

eval (update_svar_val Xu x0 ρ) phi'^{svar:0↦Xu} = eval (update_evar_val x (evar_valuation ρ y) (update_svar_val Xu x0 ρ)) phi'^{svar:0↦Xu}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
phi': Pattern
Heqphi': phi' = phi^{evar:dbi↦x}
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi'
Xu: svar
HeqXu: Xu = svar_fresh (elements (free_svars phi'))
Hfresh_subst: svar_is_fresh_in Xfr' phi' → svar_is_fresh_in Xu phi' → eval (update_svar_val Xfr' x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi'^{svar:0↦Xfr'} = eval (update_svar_val Xu x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi'^{svar:0↦Xu}
Xfr1: svar
HeqXfr1: Xfr1 = fresh_svar phi^[evar:dbi↦patt_free_evar y]
HeqHoc, HeqHoc': false = bevar_occur phi dbi

eval (update_evar_val x (evar_valuation ρ y) (update_svar_val Xu x0 ρ)) phi'^{svar:0↦Xu} = eval (update_svar_val Xu x0 ρ) phi'^{svar:0↦Xu}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
phi': Pattern
Heqphi': phi' = phi^{evar:dbi↦x}
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi'
Xu: svar
HeqXu: Xu = svar_fresh (elements (free_svars phi'))
Hfresh_subst: svar_is_fresh_in Xfr' phi' → svar_is_fresh_in Xu phi' → eval (update_svar_val Xfr' x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi'^{svar:0↦Xfr'} = eval (update_svar_val Xu x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi'^{svar:0↦Xu}
Xfr1: svar
HeqXfr1: Xfr1 = fresh_svar phi^[evar:dbi↦patt_free_evar y]
HeqHoc, HeqHoc': false = bevar_occur phi dbi

evar_is_fresh_in x phi'^{svar:0↦Xu}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
phi': Pattern
Heqphi': phi' = phi^{evar:dbi↦x}
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi'
Xu: svar
HeqXu: Xu = svar_fresh (elements (free_svars phi'))
Hfresh_subst: svar_is_fresh_in Xfr' phi' → svar_is_fresh_in Xu phi' → eval (update_svar_val Xfr' x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi'^{svar:0↦Xfr'} = eval (update_svar_val Xu x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi'^{svar:0↦Xu}
Xfr1: svar
HeqXfr1: Xfr1 = fresh_svar phi^[evar:dbi↦patt_free_evar y]
HeqHoc, HeqHoc': false = bevar_occur phi dbi

x ∉ free_evars phi'^{svar:0↦Xu}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
phi': Pattern
Heqphi': phi' = phi^{evar:dbi↦x}
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi'
Xu: svar
HeqXu: Xu = svar_fresh (elements (free_svars phi'))
Hfresh_subst: svar_is_fresh_in Xfr' phi' → svar_is_fresh_in Xu phi' → eval (update_svar_val Xfr' x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi'^{svar:0↦Xfr'} = eval (update_svar_val Xu x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi'^{svar:0↦Xu}
Xfr1: svar
HeqXfr1: Xfr1 = fresh_svar phi^[evar:dbi↦patt_free_evar y]
HeqHoc, HeqHoc': false = bevar_occur phi dbi

x ∉ free_evars phi'
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi^{evar:dbi↦x}
Xu: svar
Hfresh_subst: svar_is_fresh_in Xfr' phi^{evar:dbi↦x} → svar_is_fresh_in Xu phi^{evar:dbi↦x} → eval (update_svar_val Xfr' x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi^{evar:dbi↦x}^{svar:0↦Xfr'} = eval (update_svar_val Xu x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi^{evar:dbi↦x}^{svar:0↦Xu}
HeqXu: Xu = svar_fresh (elements (free_svars phi^{evar:dbi↦x}))
Xfr1: svar
HeqXfr1: Xfr1 = fresh_svar phi^[evar:dbi↦patt_free_evar y]
HeqHoc, HeqHoc': false = bevar_occur phi dbi

x ∉ free_evars phi^{evar:dbi↦x}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi^{evar:dbi↦x}
Xu: svar
Hfresh_subst: svar_is_fresh_in Xfr' phi^{evar:dbi↦x} → svar_is_fresh_in Xu phi^{evar:dbi↦x} → eval (update_svar_val Xfr' x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi^{evar:dbi↦x}^{svar:0↦Xfr'} = eval (update_svar_val Xu x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi^{evar:dbi↦x}^{svar:0↦Xu}
HeqXu: Xu = svar_fresh (elements (free_svars phi^{evar:dbi↦x}))
Xfr1: svar
HeqXfr1: Xfr1 = fresh_svar phi^[evar:dbi↦patt_free_evar y]
HeqHoc, HeqHoc': false = bevar_occur phi dbi

well_formed_closed_ex_aux phi dbi
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux phi (S dbi)
x0: propset M
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi^{evar:dbi↦x}
Xu: svar
Hfresh_subst: svar_is_fresh_in Xfr' phi^{evar:dbi↦x} → svar_is_fresh_in Xu phi^{evar:dbi↦x} → eval (update_svar_val Xfr' x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi^{evar:dbi↦x}^{svar:0↦Xfr'} = eval (update_svar_val Xu x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi^{evar:dbi↦x}^{svar:0↦Xu}
HeqXu: Xu = svar_fresh (elements (free_svars phi^{evar:dbi↦x}))
Xfr1: svar
HeqXfr1: Xfr1 = fresh_svar phi^[evar:dbi↦patt_free_evar y]
HeqHoc, HeqHoc': false = bevar_occur phi dbi

well_formed_closed_ex_aux phi dbi
apply wfc_ex_lower; auto.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
phi': Pattern
Heqphi': phi' = phi^{evar:dbi↦x}
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi'
Xu: svar
HeqXu: Xu = svar_fresh (elements (free_svars phi'))
Hfresh_subst: svar_is_fresh_in Xfr' phi' → svar_is_fresh_in Xu phi' → eval (update_svar_val Xfr' x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi'^{svar:0↦Xfr'} = eval (update_svar_val Xu x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi'^{svar:0↦Xu}
Xfr1: svar
HeqXfr1: Xfr1 = fresh_svar phi^[evar:dbi↦patt_free_evar y]
HeqHoc, HeqHoc': false = bevar_occur phi dbi

eval (update_svar_val Xfr1 x0 ρ) phi^{svar:0↦Xfr1} = eval (update_svar_val Xu x0 ρ) phi'^{svar:0↦Xu}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi^{evar:dbi↦x}
Xu: svar
Hfresh_subst: svar_is_fresh_in Xfr' phi^{evar:dbi↦x} → svar_is_fresh_in Xu phi^{evar:dbi↦x} → eval (update_svar_val Xfr' x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi^{evar:dbi↦x}^{svar:0↦Xfr'} = eval (update_svar_val Xu x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi^{evar:dbi↦x}^{svar:0↦Xu}
HeqXu: Xu = svar_fresh (elements (free_svars phi^{evar:dbi↦x}))
Xfr1: svar
HeqXfr1: Xfr1 = fresh_svar phi^[evar:dbi↦patt_free_evar y]
HeqHoc, HeqHoc': false = bevar_occur phi dbi

eval (update_svar_val Xfr1 x0 ρ) phi^{svar:0↦Xfr1} = eval (update_svar_val Xu x0 ρ) phi^{evar:dbi↦x}^{svar:0↦Xu}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi^{evar:dbi↦x}
Xu: svar
Hfresh_subst: svar_is_fresh_in Xfr' phi^{evar:dbi↦x} → svar_is_fresh_in Xu phi^{evar:dbi↦x} → eval (update_svar_val Xfr' x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi^{evar:dbi↦x}^{svar:0↦Xfr'} = eval (update_svar_val Xu x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi^{evar:dbi↦x}^{svar:0↦Xu}
HeqXu: Xu = svar_fresh (elements (free_svars phi^{evar:dbi↦x}))
Xfr1: svar
HeqXfr1: Xfr1 = fresh_svar phi^[evar:dbi↦patt_free_evar y]
HeqHoc, HeqHoc': false = bevar_occur phi dbi

well_formed_closed_ex_aux phi dbi
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi^{evar:dbi↦x}
Xu: svar
Hfresh_subst: svar_is_fresh_in Xfr' phi^{evar:dbi↦x} → svar_is_fresh_in Xu phi^{evar:dbi↦x} → eval (update_svar_val Xfr' x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi^{evar:dbi↦x}^{svar:0↦Xfr'} = eval (update_svar_val Xu x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi^{evar:dbi↦x}^{svar:0↦Xu}
HeqXu: Xu = svar_fresh (elements (free_svars phi^{evar:dbi↦x}))
Xfr1: svar
HeqXfr1: Xfr1 = fresh_svar phi^[evar:dbi↦patt_free_evar y]
HeqHoc, HeqHoc': false = bevar_occur phi dbi
eval (update_svar_val Xfr1 x0 ρ) phi^{svar:0↦Xfr1} = eval (update_svar_val Xu x0 ρ) phi^{svar:0↦Xu}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi^{evar:dbi↦x}
Xu: svar
Hfresh_subst: svar_is_fresh_in Xfr' phi^{evar:dbi↦x} → svar_is_fresh_in Xu phi^{evar:dbi↦x} → eval (update_svar_val Xfr' x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi^{evar:dbi↦x}^{svar:0↦Xfr'} = eval (update_svar_val Xu x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi^{evar:dbi↦x}^{svar:0↦Xu}
HeqXu: Xu = svar_fresh (elements (free_svars phi^{evar:dbi↦x}))
Xfr1: svar
HeqXfr1: Xfr1 = fresh_svar phi^[evar:dbi↦patt_free_evar y]
HeqHoc, HeqHoc': false = bevar_occur phi dbi

well_formed_closed_ex_aux phi dbi
apply wfc_ex_lower; auto.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi^{evar:dbi↦x}
Xu: svar
Hfresh_subst: svar_is_fresh_in Xfr' phi^{evar:dbi↦x} → svar_is_fresh_in Xu phi^{evar:dbi↦x} → eval (update_svar_val Xfr' x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi^{evar:dbi↦x}^{svar:0↦Xfr'} = eval (update_svar_val Xu x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi^{evar:dbi↦x}^{svar:0↦Xu}
HeqXu: Xu = svar_fresh (elements (free_svars phi^{evar:dbi↦x}))
Xfr1: svar
HeqXfr1: Xfr1 = fresh_svar phi^[evar:dbi↦patt_free_evar y]
HeqHoc, HeqHoc': false = bevar_occur phi dbi

eval (update_svar_val Xfr1 x0 ρ) phi^{svar:0↦Xfr1} = eval (update_svar_val Xu x0 ρ) phi^{svar:0↦Xu}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi^{evar:dbi↦x}
Xu: svar
Hfresh_subst: svar_is_fresh_in Xfr' phi^{evar:dbi↦x} → svar_is_fresh_in Xu phi^{evar:dbi↦x} → eval (update_svar_val Xfr' x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi^{evar:dbi↦x}^{svar:0↦Xfr'} = eval (update_svar_val Xu x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi^{evar:dbi↦x}^{svar:0↦Xu}
HeqXu: Xu = svar_fresh (elements (free_svars phi^{evar:dbi↦x}))
Xfr1: svar
HeqXfr1: Xfr1 = fresh_svar phi^[evar:dbi↦patt_free_evar y]
HeqHoc, HeqHoc': false = bevar_occur phi dbi

eval (update_svar_val Xu x0 ρ) phi^{svar:0↦Xu} = eval (update_svar_val Xu x0 ρ) phi^{svar:0↦Xu}
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi^{evar:dbi↦x}
Xu: svar
Hfresh_subst: svar_is_fresh_in Xfr' phi^{evar:dbi↦x} → svar_is_fresh_in Xu phi^{evar:dbi↦x} → eval (update_svar_val Xfr' x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi^{evar:dbi↦x}^{svar:0↦Xfr'} = eval (update_svar_val Xu x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi^{evar:dbi↦x}^{svar:0↦Xu}
HeqXu: Xu = svar_fresh (elements (free_svars phi^{evar:dbi↦x}))
Xfr1: svar
HeqXfr1: Xfr1 = fresh_svar phi^[evar:dbi↦patt_free_evar y]
HeqHoc, HeqHoc': false = bevar_occur phi dbi
svar_is_fresh_in Xfr1 phi
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi^{evar:dbi↦x}
Xu: svar
Hfresh_subst: svar_is_fresh_in Xfr' phi^{evar:dbi↦x} → svar_is_fresh_in Xu phi^{evar:dbi↦x} → eval (update_svar_val Xfr' x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi^{evar:dbi↦x}^{svar:0↦Xfr'} = eval (update_svar_val Xu x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi^{evar:dbi↦x}^{svar:0↦Xu}
HeqXu: Xu = svar_fresh (elements (free_svars phi^{evar:dbi↦x}))
Xfr1: svar
HeqXfr1: Xfr1 = fresh_svar phi^[evar:dbi↦patt_free_evar y]
HeqHoc, HeqHoc': false = bevar_occur phi dbi
svar_is_fresh_in Xu phi
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi^{evar:dbi↦x}
Xu: svar
Hfresh_subst: svar_is_fresh_in Xfr' phi^{evar:dbi↦x} → svar_is_fresh_in Xu phi^{evar:dbi↦x} → eval (update_svar_val Xfr' x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi^{evar:dbi↦x}^{svar:0↦Xfr'} = eval (update_svar_val Xu x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi^{evar:dbi↦x}^{svar:0↦Xu}
HeqXu: Xu = svar_fresh (elements (free_svars phi^{evar:dbi↦x}))
Xfr1: svar
HeqXfr1: Xfr1 = fresh_svar phi^[evar:dbi↦patt_free_evar y]
HeqHoc, HeqHoc': false = bevar_occur phi dbi

svar_is_fresh_in Xfr1 phi
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi^{evar:dbi↦x}
Xu: svar
Hfresh_subst: svar_is_fresh_in Xfr' phi^{evar:dbi↦x} → svar_is_fresh_in Xu phi^{evar:dbi↦x} → eval (update_svar_val Xfr' x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi^{evar:dbi↦x}^{svar:0↦Xfr'} = eval (update_svar_val Xu x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi^{evar:dbi↦x}^{svar:0↦Xu}
HeqXu: Xu = svar_fresh (elements (free_svars phi^{evar:dbi↦x}))
Xfr1: svar
HeqXfr1: Xfr1 = fresh_svar phi^[evar:dbi↦patt_free_evar y]
HeqHoc, HeqHoc': false = bevar_occur phi dbi
svar_is_fresh_in Xu phi
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi^{evar:dbi↦x}
Xu: svar
Hfresh_subst: svar_is_fresh_in Xfr' phi^{evar:dbi↦x} → svar_is_fresh_in Xu phi^{evar:dbi↦x} → eval (update_svar_val Xfr' x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi^{evar:dbi↦x}^{svar:0↦Xfr'} = eval (update_svar_val Xu x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi^{evar:dbi↦x}^{svar:0↦Xu}
HeqXu: Xu = svar_fresh (elements (free_svars phi^{evar:dbi↦x}))
Xfr1: svar
HeqXfr1: Xfr1 = fresh_svar phi^[evar:dbi↦patt_free_evar y]
HeqHoc, HeqHoc': false = bevar_occur phi dbi

svar_is_fresh_in Xfr1 phi
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi^{evar:dbi↦x}
Xu: svar
Hfresh_subst: svar_is_fresh_in Xfr' phi^{evar:dbi↦x} → svar_is_fresh_in Xu phi^{evar:dbi↦x} → eval (update_svar_val Xfr' x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi^{evar:dbi↦x}^{svar:0↦Xfr'} = eval (update_svar_val Xu x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi^{evar:dbi↦x}^{svar:0↦Xu}
HeqXu: Xu = svar_fresh (elements (free_svars phi^{evar:dbi↦x}))
HeqHoc, HeqHoc': false = bevar_occur phi dbi

svar_is_fresh_in (fresh_svar phi^[evar:dbi↦patt_free_evar y]) phi
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux phi (S dbi)
x0: propset M
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi^{evar:dbi↦x}
Xu: svar
Hfresh_subst: svar_is_fresh_in Xfr' phi^{evar:dbi↦x} → svar_is_fresh_in Xu phi^{evar:dbi↦x} → eval (update_svar_val Xfr' x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi^{evar:dbi↦x}^{svar:0↦Xfr'} = eval (update_svar_val Xu x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi^{evar:dbi↦x}^{svar:0↦Xu}
HeqXu: Xu = svar_fresh (elements (free_svars phi^{evar:dbi↦x}))
HeqHoc, HeqHoc': false = bevar_occur phi dbi

svar_is_fresh_in (fresh_svar phi^[evar:dbi↦patt_free_evar y]) phi
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux phi (S dbi)
x0: propset M
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi^{evar:dbi↦x}
Xu: svar
Hfresh_subst: svar_is_fresh_in Xfr' phi^{evar:dbi↦x} → svar_is_fresh_in Xu phi^{evar:dbi↦x} → eval (update_svar_val Xfr' x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi^{evar:dbi↦x}^{svar:0↦Xfr'} = eval (update_svar_val Xu x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi^{evar:dbi↦x}^{svar:0↦Xu}
HeqXu: Xu = svar_fresh (elements (free_svars phi^{evar:dbi↦x}))
HeqHoc: false = bevar_occur phi dbi
HeqHoc': bevar_occur phi dbi = false

svar_is_fresh_in (fresh_svar phi^[evar:dbi↦patt_free_evar y]) phi
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux phi dbi = true
x0: propset M
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi^{evar:dbi↦x}
Xu: svar
Hfresh_subst: svar_is_fresh_in Xfr' phi^{evar:dbi↦x} → svar_is_fresh_in Xu phi^{evar:dbi↦x} → eval (update_svar_val Xfr' x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi^{evar:dbi↦x}^{svar:0↦Xfr'} = eval (update_svar_val Xu x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi^{evar:dbi↦x}^{svar:0↦Xu}
HeqXu: Xu = svar_fresh (elements (free_svars phi^{evar:dbi↦x}))
HeqHoc: false = bevar_occur phi dbi
HeqHoc': bevar_occur phi dbi = false

svar_is_fresh_in (fresh_svar phi^[evar:dbi↦patt_free_evar y]) phi
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux phi dbi = true
x0: propset M
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi^{evar:dbi↦x}
Xu: svar
Hfresh_subst: svar_is_fresh_in Xfr' phi^{evar:dbi↦x} → svar_is_fresh_in Xu phi^{evar:dbi↦x} → eval (update_svar_val Xfr' x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi^{evar:dbi↦x}^{svar:0↦Xfr'} = eval (update_svar_val Xu x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi^{evar:dbi↦x}^{svar:0↦Xu}
HeqXu: Xu = svar_fresh (elements (free_svars phi^{evar:dbi↦x}))
HeqHoc: false = bevar_occur phi dbi
HeqHoc': bevar_occur phi dbi = false
Hsubst: phi^[evar:dbi↦patt_free_evar y] = phi

svar_is_fresh_in (fresh_svar phi^[evar:dbi↦patt_free_evar y]) phi
rewrite Hsubst; auto.
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi^{evar:dbi↦x}
Xu: svar
Hfresh_subst: svar_is_fresh_in Xfr' phi^{evar:dbi↦x} → svar_is_fresh_in Xu phi^{evar:dbi↦x} → eval (update_svar_val Xfr' x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi^{evar:dbi↦x}^{svar:0↦Xfr'} = eval (update_svar_val Xu x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi^{evar:dbi↦x}^{svar:0↦Xu}
HeqXu: Xu = svar_fresh (elements (free_svars phi^{evar:dbi↦x}))
Xfr1: svar
HeqXfr1: Xfr1 = fresh_svar phi^[evar:dbi↦patt_free_evar y]
HeqHoc, HeqHoc': false = bevar_occur phi dbi

svar_is_fresh_in Xu phi
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi^{evar:dbi↦x}
Xu: svar
Hfresh_subst: svar_is_fresh_in Xfr' phi^{evar:dbi↦x} → svar_is_fresh_in Xu phi^{evar:dbi↦x} → eval (update_svar_val Xfr' x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi^{evar:dbi↦x}^{svar:0↦Xfr'} = eval (update_svar_val Xu x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi^{evar:dbi↦x}^{svar:0↦Xu}
HeqXu: Xu = svar_fresh (elements (free_svars phi^{evar:dbi↦x}))
Xfr1: svar
HeqXfr1: Xfr1 = fresh_svar phi^[evar:dbi↦patt_free_evar y]
HeqHoc, HeqHoc': false = bevar_occur phi dbi

svar_is_fresh_in Xu phi
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi^{evar:dbi↦x}
Xu: svar
Hfresh_subst: svar_is_fresh_in Xfr' phi^{evar:dbi↦x} → svar_is_fresh_in Xu phi^{evar:dbi↦x} → eval (update_svar_val Xfr' x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi^{evar:dbi↦x}^{svar:0↦Xfr'} = eval (update_svar_val Xu x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi^{evar:dbi↦x}^{svar:0↦Xu}
HeqXu: Xu = svar_fresh (elements (free_svars phi^{evar:dbi↦x}))
Xfr1: svar
HeqXfr1: Xfr1 = fresh_svar phi^[evar:dbi↦patt_free_evar y]
HeqHoc, HeqHoc': false = bevar_occur phi dbi
Hfr: S : SVarSet, svar_fresh (elements S) ∉ S

svar_is_fresh_in Xu phi
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi^{evar:dbi↦x}
Xu: svar
Hfresh_subst: svar_is_fresh_in Xfr' phi^{evar:dbi↦x} → svar_is_fresh_in Xu phi^{evar:dbi↦x} → eval (update_svar_val Xfr' x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi^{evar:dbi↦x}^{svar:0↦Xfr'} = eval (update_svar_val Xu x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi^{evar:dbi↦x}^{svar:0↦Xu}
HeqXu: Xu = svar_fresh (elements (free_svars phi^{evar:dbi↦x}))
Xfr1: svar
HeqXfr1: Xfr1 = fresh_svar phi^[evar:dbi↦patt_free_evar y]
HeqHoc, HeqHoc': false = bevar_occur phi dbi
Hfr: svar_fresh (elements (free_svars phi^{evar:dbi↦x})) ∉ free_svars phi^{evar:dbi↦x}

svar_is_fresh_in Xu phi
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi^{evar:dbi↦x}
Hfresh_subst: svar_is_fresh_in Xfr' phi^{evar:dbi↦x} → svar_is_fresh_in (svar_fresh (elements (free_svars phi^{evar:dbi↦x}))) phi^{evar:dbi↦x} → eval (update_svar_val Xfr' x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi^{evar:dbi↦x}^{svar:0↦Xfr'} = eval (update_svar_val (svar_fresh (elements (free_svars phi^{evar:dbi↦x}))) x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi^{evar:dbi↦x}^{svar:0↦ svar_fresh (elements (free_svars phi^{evar:dbi↦x}))}
Xfr1: svar
HeqXfr1: Xfr1 = fresh_svar phi^[evar:dbi↦patt_free_evar y]
HeqHoc, HeqHoc': false = bevar_occur phi dbi
Hfr: svar_fresh (elements (free_svars phi^{evar:dbi↦x})) ∉ free_svars phi^{evar:dbi↦x}

svar_is_fresh_in (svar_fresh (elements (free_svars phi^{evar:dbi↦x}))) phi
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi^{evar:dbi↦x}
Hfresh_subst: svar_is_fresh_in Xfr' phi^{evar:dbi↦x} → svar_is_fresh_in (svar_fresh (elements (free_svars phi^{evar:dbi↦x}))) phi^{evar:dbi↦x} → eval (update_svar_val Xfr' x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi^{evar:dbi↦x}^{svar:0↦Xfr'} = eval (update_svar_val (svar_fresh (elements (free_svars phi^{evar:dbi↦x}))) x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi^{evar:dbi↦x}^{svar:0↦ svar_fresh (elements (free_svars phi^{evar:dbi↦x}))}
Xfr1: svar
HeqXfr1: Xfr1 = fresh_svar phi^[evar:dbi↦patt_free_evar y]
HeqHoc, HeqHoc': false = bevar_occur phi dbi
Hfr: svar_fresh (elements (free_svars phi)) ∉ free_svars phi

svar_is_fresh_in (svar_fresh (elements (free_svars phi^{evar:dbi↦x}))) phi
signature: Signature
M: Model
sz: nat
IHsz: (dbi : db_index) (phi : Pattern) (y : evar), size phi ≤ sz → (ρ : Valuation) (x : evar), evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦ patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
dbi: db_index
phi: Pattern
y: evar
Hsz: size (mu , phi) ≤ S sz
ρ: Valuation
x: evar
H: evar_is_fresh_in x (mu , phi)
Hwf: well_formed_closed_ex_aux (mu , phi) (S dbi)
x0: propset M
Xfr': svar
HeqXfr': Xfr' = fresh_svar phi^{evar:dbi↦x}
Hfresh_subst: svar_is_fresh_in Xfr' phi^{evar:dbi↦x} → svar_is_fresh_in (svar_fresh (elements (free_svars phi^{evar:dbi↦x}))) phi^{evar:dbi↦x} → eval (update_svar_val Xfr' x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi^{evar:dbi↦x}^{svar:0↦Xfr'} = eval (update_svar_val (svar_fresh (elements (free_svars phi^{evar:dbi↦x}))) x0 (update_evar_val x (evar_valuation ρ y) ρ)) phi^{evar:dbi↦x}^{svar:0↦ svar_fresh (elements (free_svars phi^{evar:dbi↦x}))}
Xfr1: svar
HeqXfr1: Xfr1 = fresh_svar phi^[evar:dbi↦patt_free_evar y]
HeqHoc, HeqHoc': false = bevar_occur phi dbi
Hfr: svar_fresh (elements (free_svars phi)) ∉ free_svars phi

svar_is_fresh_in (svar_fresh (elements (free_svars phi))) phi
auto. } Qed.
signature: Signature
M: Model
phi: Pattern
x, y: evar
ρ: Valuation
dbi: db_index

evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
signature: Signature
M: Model
phi: Pattern
x, y: evar
ρ: Valuation
dbi: db_index

evar_is_fresh_in x phi → well_formed_closed_ex_aux phi (S dbi) → eval ρ phi^[evar:dbi↦patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
signature: Signature
M: Model
phi: Pattern
x, y: evar
ρ: Valuation
dbi: db_index
H: evar_is_fresh_in x phi
H0: well_formed_closed_ex_aux phi (S dbi)

eval ρ phi^[evar:dbi↦patt_free_evar y] = eval (update_evar_val x (evar_valuation ρ y) ρ) phi^{evar:dbi↦x}
apply Private_plugging_patterns_bevar_subst with (sz := size phi);auto. Qed. (* eval unchanged within subformula over fresh element variable *)
signature: Signature
M: Model
ϕ₁, ϕ₂: Pattern
c: M
dbi: db_index
ρ: Valuation

is_subformula_of_ind ϕ₁ ϕ₂ → eval (update_evar_val (fresh_evar ϕ₂) c ρ) ϕ₁^{evar:dbi↦fresh_evar ϕ₂} = eval (update_evar_val (fresh_evar ϕ₁) c ρ) ϕ₁^{evar:dbi↦fresh_evar ϕ₁}
signature: Signature
M: Model
ϕ₁, ϕ₂: Pattern
c: M
dbi: db_index
ρ: Valuation

is_subformula_of_ind ϕ₁ ϕ₂ → eval (update_evar_val (fresh_evar ϕ₂) c ρ) ϕ₁^{evar:dbi↦fresh_evar ϕ₂} = eval (update_evar_val (fresh_evar ϕ₁) c ρ) ϕ₁^{evar:dbi↦fresh_evar ϕ₁}
signature: Signature
M: Model
ϕ₁, ϕ₂: Pattern
c: M
dbi: db_index
ρ: Valuation
Hsub: is_subformula_of_ind ϕ₁ ϕ₂

eval (update_evar_val (fresh_evar ϕ₂) c ρ) ϕ₁^{evar:dbi↦fresh_evar ϕ₂} = eval (update_evar_val (fresh_evar ϕ₁) c ρ) ϕ₁^{evar:dbi↦fresh_evar ϕ₁}
signature: Signature
M: Model
ϕ₁, ϕ₂: Pattern
c: M
dbi: db_index
ρ: Valuation
Hsub: is_subformula_of_ind ϕ₁ ϕ₂

evar_is_fresh_in (fresh_evar ϕ₂) ϕ₁
signature: Signature
M: Model
ϕ₁, ϕ₂: Pattern
c: M
dbi: db_index
ρ: Valuation
Hsub: is_subformula_of_ind ϕ₁ ϕ₂

is_subformula_of_ind ϕ₁ ?ϕ₂
signature: Signature
M: Model
ϕ₁, ϕ₂: Pattern
c: M
dbi: db_index
ρ: Valuation
Hsub: is_subformula_of_ind ϕ₁ ϕ₂
evar_is_fresh_in (fresh_evar ϕ₂) ?ϕ₂
signature: Signature
M: Model
ϕ₁, ϕ₂: Pattern
c: M
dbi: db_index
ρ: Valuation
Hsub: is_subformula_of_ind ϕ₁ ϕ₂

evar_is_fresh_in (fresh_evar ϕ₂) ϕ₂
apply set_evar_fresh_is_fresh. Qed. (* model predicate of evar_open is maintained with change of variables *)
signature: Signature
M: Model
x₁, x₂: evar
ϕ: Pattern

evar_is_fresh_in x₁ ϕ → evar_is_fresh_in x₂ ϕ → M_predicate M ϕ^{evar:0↦x₁} → M_predicate M ϕ^{evar:0↦x₂}
signature: Signature
M: Model
x₁, x₂: evar
ϕ: Pattern

evar_is_fresh_in x₁ ϕ → evar_is_fresh_in x₂ ϕ → M_predicate M ϕ^{evar:0↦x₁} → M_predicate M ϕ^{evar:0↦x₂}
signature: Signature
M: Model
x₁, x₂: evar
ϕ: Pattern
Hfr1: evar_is_fresh_in x₁ ϕ
Hfr2: evar_is_fresh_in x₂ ϕ

M_predicate M ϕ^{evar:0↦x₁} → M_predicate M ϕ^{evar:0↦x₂}
signature: Signature
M: Model
x₁, x₂: evar
ϕ: Pattern
Hfr1: x₁ ∉ free_evars ϕ
Hfr2: x₂ ∉ free_evars ϕ

M_predicate M ϕ^{evar:0↦x₁} → M_predicate M ϕ^{evar:0↦x₂}
signature: Signature
M: Model
x₁, x₂: evar
ϕ: Pattern
Hfr1: x₁ ∉ free_evars ϕ
Hfr2: x₂ ∉ free_evars ϕ

( ρ : Valuation, eval ρ ϕ^{evar:0↦x₁} = ⊤ ∨ eval ρ ϕ^{evar:0↦x₁} = ∅) → ρ : Valuation, eval ρ ϕ^{evar:0↦x₂} = ⊤ ∨ eval ρ ϕ^{evar:0↦x₂} = ∅
signature: Signature
M: Model
x₁, x₂: evar
ϕ: Pattern
Hfr1: x₁ ∉ free_evars ϕ
Hfr2: x₂ ∉ free_evars ϕ
H: ρ : Valuation, eval ρ ϕ^{evar:0↦x₁} = ⊤ ∨ eval ρ ϕ^{evar:0↦x₁} = ∅
ρ: Valuation

eval ρ ϕ^{evar:0↦x₂} = ⊤ ∨ eval ρ ϕ^{evar:0↦x₂} = ∅
signature: Signature
M: Model
x₁, x₂: evar
ϕ: Pattern
Hfr1: x₁ ∉ free_evars ϕ
Hfr2: x₂ ∉ free_evars ϕ
H: ρ : Valuation, eval ρ ϕ^{evar:0↦x₁} = ⊤ ∨ eval ρ ϕ^{evar:0↦x₁} = ∅
ρ: Valuation

eval (update_evar_val x₂ (evar_valuation ρ x₂) ρ) ϕ^{evar:0↦x₂} = ⊤ ∨ eval (update_evar_val x₂ (evar_valuation ρ x₂) ρ) ϕ^{evar:0↦x₂} = ∅
rewrite (eval_fresh_evar_open _ x₂ x₁); auto. Qed.
signature: Signature
M: Model
x: evar
ϕ: Pattern

evar_is_fresh_in x ϕ → M_predicate M ϕ^{evar:0↦fresh_evar ϕ} → M_predicate M ϕ^{evar:0↦x}
signature: Signature
M: Model
x: evar
ϕ: Pattern

evar_is_fresh_in x ϕ → M_predicate M ϕ^{evar:0↦fresh_evar ϕ} → M_predicate M ϕ^{evar:0↦x}
signature: Signature
M: Model
x: evar
ϕ: Pattern
Hfr: evar_is_fresh_in x ϕ
H: M_predicate M ϕ^{evar:0↦fresh_evar ϕ}

M_predicate M ϕ^{evar:0↦x}
apply M_predicate_evar_open_fresh_evar_1 with (x₁ := fresh_evar ϕ); auto. Qed. (* Similar to plugging_patterns: using free svar substitution instead of bound svar substitution. TODO: we may be able to gneeralize this lemma to non-closed psi, if we deal with nest_mu properly *)
signature: Signature
M: Model

(sz : nat) (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
signature: Signature
M: Model

(sz : nat) (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
signature: Signature
M: Model

(sz : nat) (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
signature: Signature
M: Model
x: svar
psi: Pattern
X: svar
ρ: Valuation
Hsz: 00
Hwf: well_formed psi
Hwfc: well_formed_closed (patt_free_svar x)

eval ρ (if decide (X = x) then psi else patt_free_svar x) = eval (update_svar_val X (eval ρ psi) ρ) (patt_free_svar x)
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
x: svar
psi: Pattern
X: svar
ρ: Valuation
Hsz: 0 ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (patt_free_svar x)
m: nat
H0: 0 ≤ sz
H: m = sz
eval ρ (if decide (X = x) then psi else patt_free_svar x) = eval (update_svar_val X (eval ρ psi) ρ) (patt_free_svar x)
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 $ phi2)
H0: size phi1 + size phi2 = sz
eval ρ ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi1 $ (fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi2) = eval (update_svar_val X (eval ρ psi) ρ) (phi1 $ phi2)
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 $ phi2)
m: nat
H0: S (size phi1 + size phi2) ≤ sz
H: m = sz
eval ρ ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi1 $ (fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi2) = eval (update_svar_val X (eval ρ psi) ρ) (phi1 $ phi2)
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 ---> phi2)
H0: size phi1 + size phi2 = sz
eval ρ ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi1 ---> (fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi2) = eval (update_svar_val X (eval ρ psi) ρ) (phi1 ---> phi2)
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 ---> phi2)
m: nat
H0: S (size phi1 + size phi2) ≤ sz
H: m = sz
eval ρ ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi1 ---> (fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi2) = eval (update_svar_val X (eval ρ psi) ρ) (phi1 ---> phi2)
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
eval ρ (ex , (fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) (ex , phi)
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
eval ρ (ex , (fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) (ex , phi)
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
eval ρ (mu , (fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) (mu , phi)
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
eval ρ (mu , (fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) (mu , phi)
signature: Signature
M: Model
x: svar
psi: Pattern
X: svar
ρ: Valuation
Hsz: 00
Hwf: well_formed psi
Hwfc: well_formed_closed (patt_free_svar x)

eval ρ (if decide (X = x) then psi else patt_free_svar x) = eval (update_svar_val X (eval ρ psi) ρ) (patt_free_svar x)
signature: Signature
M: Model
x: svar
psi: Pattern
X: svar
ρ: Valuation
Hsz: 00
Hwf: well_formed psi
Hwfc: well_formed_closed (patt_free_svar x)

eval ρ (if decide (X = x) then psi else patt_free_svar x) = svar_valuation (update_svar_val X (eval ρ psi) ρ) x
signature: Signature
M: Model
x: svar
psi: Pattern
X: svar
ρ: Valuation
Hsz: 00
Hwf: well_formed psi
Hwfc: well_formed_closed (patt_free_svar x)

eval ρ (if decide (X = x) then psi else patt_free_svar x) = svar_valuation {| evar_valuation := evar_valuation ρ; svar_valuation := λ sv' : svar, if decide (X = sv') then eval ρ psi else svar_valuation ρ sv' |} x
signature: Signature
M: Model
x: svar
psi: Pattern
X: svar
ρ: Valuation
Hsz: 00
Hwf: well_formed psi
Hwfc: well_formed_closed (patt_free_svar x)

eval ρ (if decide (X = x) then psi else patt_free_svar x) = (if decide (X = x) then eval ρ psi else svar_valuation ρ x)
signature: Signature
M: Model
x: svar
psi: Pattern
X: svar
ρ: Valuation
Hsz: 00
Hwf: well_formed psi
Hwfc: well_formed_closed (patt_free_svar x)
e: X = x

eval ρ psi = eval ρ psi
signature: Signature
M: Model
x: svar
psi: Pattern
X: svar
ρ: Valuation
Hsz: 00
Hwf: well_formed psi
Hwfc: well_formed_closed (patt_free_svar x)
n: X ≠ x
eval ρ (patt_free_svar x) = svar_valuation ρ x
signature: Signature
M: Model
x: svar
psi: Pattern
X: svar
ρ: Valuation
Hsz: 00
Hwf: well_formed psi
Hwfc: well_formed_closed (patt_free_svar x)
e: X = x

eval ρ psi = eval ρ psi
reflexivity.
signature: Signature
M: Model
x: svar
psi: Pattern
X: svar
ρ: Valuation
Hsz: 00
Hwf: well_formed psi
Hwfc: well_formed_closed (patt_free_svar x)
n: X ≠ x

eval ρ (patt_free_svar x) = svar_valuation ρ x
signature: Signature
M: Model
x: svar
psi: Pattern
X: svar
ρ: Valuation
Hsz: 00
Hwf: well_formed psi
Hwfc: well_formed_closed (patt_free_svar x)
n: X ≠ x

svar_valuation ρ x = svar_valuation ρ x
reflexivity.
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
x: svar
psi: Pattern
X: svar
ρ: Valuation
Hsz: 0 ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (patt_free_svar x)
m: nat
H0: 0 ≤ sz
H: m = sz

eval ρ (if decide (X = x) then psi else patt_free_svar x) = eval (update_svar_val X (eval ρ psi) ρ) (patt_free_svar x)
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
x: svar
psi: Pattern
X: svar
ρ: Valuation
Hsz: 0 ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (patt_free_svar x)
m: nat
H0: 0 ≤ sz
H: m = sz

eval ρ (if decide (X = x) then psi else patt_free_svar x) = svar_valuation (update_svar_val X (eval ρ psi) ρ) x
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
x: svar
psi: Pattern
X: svar
ρ: Valuation
Hsz: 0 ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (patt_free_svar x)
m: nat
H0: 0 ≤ sz
H: m = sz

eval ρ (if decide (X = x) then psi else patt_free_svar x) = svar_valuation {| evar_valuation := evar_valuation ρ; svar_valuation := λ sv' : svar, if decide (X = sv') then eval ρ psi else svar_valuation ρ sv' |} x
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
x: svar
psi: Pattern
X: svar
ρₑ: evar → M
ρₛ: svar → propset M
Hsz: 0 ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (patt_free_svar x)
m: nat
H0: 0 ≤ sz
H: m = sz

eval {| evar_valuation := ρₑ; svar_valuation := ρₛ |} (if decide (X = x) then psi else patt_free_svar x) = svar_valuation {| evar_valuation := evar_valuation {| evar_valuation := ρₑ; svar_valuation := ρₛ |}; svar_valuation := λ sv' : svar, if decide (X = sv') then eval {| evar_valuation := ρₑ; svar_valuation := ρₛ |} psi else svar_valuation {| evar_valuation := ρₑ; svar_valuation := ρₛ |} sv' |} x
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
x: svar
psi: Pattern
X: svar
ρₑ: evar → M
ρₛ: svar → propset M
Hsz: 0 ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (patt_free_svar x)
m: nat
H0: 0 ≤ sz
H: m = sz

eval {| evar_valuation := ρₑ; svar_valuation := ρₛ |} (if decide (X = x) then psi else patt_free_svar x) = (if decide (X = x) then eval {| evar_valuation := ρₑ; svar_valuation := ρₛ |} psi else ρₛ x)
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
x: svar
psi: Pattern
X: svar
ρₑ: evar → M
ρₛ: svar → propset M
Hsz: 0 ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (patt_free_svar x)
m: nat
H0: 0 ≤ sz
H: m = sz
e: X = x

eval {| evar_valuation := ρₑ; svar_valuation := ρₛ |} psi = eval {| evar_valuation := ρₑ; svar_valuation := ρₛ |} psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
x: svar
psi: Pattern
X: svar
ρₑ: evar → M
ρₛ: svar → propset M
Hsz: 0 ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (patt_free_svar x)
m: nat
H0: 0 ≤ sz
H: m = sz
n: X ≠ x
eval {| evar_valuation := ρₑ; svar_valuation := ρₛ |} (patt_free_svar x) = ρₛ x
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
x: svar
psi: Pattern
X: svar
ρₑ: evar → M
ρₛ: svar → propset M
Hsz: 0 ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (patt_free_svar x)
m: nat
H0: 0 ≤ sz
H: m = sz
e: X = x

eval {| evar_valuation := ρₑ; svar_valuation := ρₛ |} psi = eval {| evar_valuation := ρₑ; svar_valuation := ρₛ |} psi
reflexivity.
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
x: svar
psi: Pattern
X: svar
ρₑ: evar → M
ρₛ: svar → propset M
Hsz: 0 ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (patt_free_svar x)
m: nat
H0: 0 ≤ sz
H: m = sz
n: X ≠ x

eval {| evar_valuation := ρₑ; svar_valuation := ρₛ |} (patt_free_svar x) = ρₛ x
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
x: svar
psi: Pattern
X: svar
ρₑ: evar → M
ρₛ: svar → propset M
Hsz: 0 ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (patt_free_svar x)
m: nat
H0: 0 ≤ sz
H: m = sz
n: X ≠ x

svar_valuation {| evar_valuation := ρₑ; svar_valuation := ρₛ |} x = ρₛ x
reflexivity.
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 $ phi2)
H0: size phi1 + size phi2 = sz

eval ρ ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi1 $ (fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi2) = eval (update_svar_val X (eval ρ psi) ρ) (phi1 $ phi2)
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 $ phi2)
H0: size phi1 + size phi2 = sz

app_ext (eval ρ ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi1)) (eval ρ ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi2)) = app_ext (eval (update_svar_val X (eval ρ psi) ρ) phi1) (eval (update_svar_val X (eval ρ psi) ρ) phi2)
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 $ phi2)
H0: size phi1 + size phi2 = sz

app_ext (eval (update_svar_val X (eval ρ psi) ρ) phi1) (eval ρ ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi2)) = app_ext (eval (update_svar_val X (eval ρ psi) ρ) phi1) (eval (update_svar_val X (eval ρ psi) ρ) phi2)
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 $ phi2)
H0: size phi1 + size phi2 = sz
size phi1 ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 $ phi2)
H0: size phi1 + size phi2 = sz
well_formed psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 $ phi2)
H0: size phi1 + size phi2 = sz
well_formed_closed phi1
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 $ phi2)
H0: size phi1 + size phi2 = sz

app_ext (eval (update_svar_val X (eval ρ psi) ρ) phi1) (eval (update_svar_val X (eval ρ psi) ρ) phi2) = app_ext (eval (update_svar_val X (eval ρ psi) ρ) phi1) (eval (update_svar_val X (eval ρ psi) ρ) phi2)
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 $ phi2)
H0: size phi1 + size phi2 = sz
size phi2 ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 $ phi2)
H0: size phi1 + size phi2 = sz
well_formed psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 $ phi2)
H0: size phi1 + size phi2 = sz
well_formed_closed phi2
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 $ phi2)
H0: size phi1 + size phi2 = sz
size phi1 ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 $ phi2)
H0: size phi1 + size phi2 = sz
well_formed psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 $ phi2)
H0: size phi1 + size phi2 = sz
well_formed_closed phi1
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 $ phi2)
H0: size phi1 + size phi2 = sz

size phi2 ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 $ phi2)
H0: size phi1 + size phi2 = sz
well_formed psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 $ phi2)
H0: size phi1 + size phi2 = sz
well_formed_closed phi2
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 $ phi2)
H0: size phi1 + size phi2 = sz
size phi1 ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 $ phi2)
H0: size phi1 + size phi2 = sz
well_formed psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 $ phi2)
H0: size phi1 + size phi2 = sz
well_formed_closed phi1
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 $ phi2)
H0: size phi1 + size phi2 = sz

well_formed psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 $ phi2)
H0: size phi1 + size phi2 = sz
well_formed_closed phi2
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 $ phi2)
H0: size phi1 + size phi2 = sz
size phi1 ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 $ phi2)
H0: size phi1 + size phi2 = sz
well_formed psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 $ phi2)
H0: size phi1 + size phi2 = sz
well_formed_closed phi1
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 $ phi2)
H0: size phi1 + size phi2 = sz

well_formed_closed phi2
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 $ phi2)
H0: size phi1 + size phi2 = sz
size phi1 ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 $ phi2)
H0: size phi1 + size phi2 = sz
well_formed psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 $ phi2)
H0: size phi1 + size phi2 = sz
well_formed_closed phi1
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 $ phi2)
H0: size phi1 + size phi2 = sz

well_formed_closed phi2
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc1: well_formed_closed_mu_aux (phi1 $ phi2) 0 = true
Hwfc2: well_formed_closed_ex_aux (phi1 $ phi2) 0 = true
H0: size phi1 + size phi2 = sz

well_formed_closed phi2
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc1: well_formed_closed_mu_aux phi1 0 && well_formed_closed_mu_aux phi2 0 = true
Hwfc2: well_formed_closed_ex_aux phi1 0 && well_formed_closed_ex_aux phi2 0 = true
H0: size phi1 + size phi2 = sz

well_formed_closed phi2
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc11: well_formed_closed_mu_aux phi1 0 = true
Hwfc12: well_formed_closed_mu_aux phi2 0 = true
Hwfc2: well_formed_closed_ex_aux phi1 0 && well_formed_closed_ex_aux phi2 0 = true
H0: size phi1 + size phi2 = sz

well_formed_closed phi2
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc11: well_formed_closed_mu_aux phi1 0 = true
Hwfc12: well_formed_closed_mu_aux phi2 0 = true
Hwfc21: well_formed_closed_ex_aux phi1 0 = true
Hwfc22: well_formed_closed_ex_aux phi2 0 = true
H0: size phi1 + size phi2 = sz

well_formed_closed phi2
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc11: well_formed_closed_mu_aux phi1 0 = true
Hwfc12: well_formed_closed_mu_aux phi2 0 = true
Hwfc21: well_formed_closed_ex_aux phi1 0 = true
Hwfc22: well_formed_closed_ex_aux phi2 0 = true
H0: size phi1 + size phi2 = sz

well_formed_closed_mu_aux phi2 0 = true ∧ well_formed_closed_ex_aux phi2 0 = true
split; auto.
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 $ phi2)
H0: size phi1 + size phi2 = sz

size phi1 ≤ sz
lia.
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 $ phi2)
H0: size phi1 + size phi2 = sz

well_formed psi
auto.
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 $ phi2)
H0: size phi1 + size phi2 = sz

well_formed_closed phi1
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc1: well_formed_closed_mu_aux (phi1 $ phi2) 0 = true
Hwfc2: well_formed_closed_ex_aux (phi1 $ phi2) 0 = true
H0: size phi1 + size phi2 = sz

well_formed_closed phi1
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc1: well_formed_closed_mu_aux phi1 0 && well_formed_closed_mu_aux phi2 0 = true
Hwfc2: well_formed_closed_ex_aux phi1 0 && well_formed_closed_ex_aux phi2 0 = true
H0: size phi1 + size phi2 = sz

well_formed_closed phi1
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc11: well_formed_closed_mu_aux phi1 0 = true
Hwfc12: well_formed_closed_mu_aux phi2 0 = true
Hwfc2: well_formed_closed_ex_aux phi1 0 && well_formed_closed_ex_aux phi2 0 = true
H0: size phi1 + size phi2 = sz

well_formed_closed phi1
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc11: well_formed_closed_mu_aux phi1 0 = true
Hwfc12: well_formed_closed_mu_aux phi2 0 = true
Hwfc21: well_formed_closed_ex_aux phi1 0 = true
Hwfc22: well_formed_closed_ex_aux phi2 0 = true
H0: size phi1 + size phi2 = sz

well_formed_closed phi1
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc11: well_formed_closed_mu_aux phi1 0 = true
Hwfc12: well_formed_closed_mu_aux phi2 0 = true
Hwfc21: well_formed_closed_ex_aux phi1 0 = true
Hwfc22: well_formed_closed_ex_aux phi2 0 = true
H0: size phi1 + size phi2 = sz

well_formed_closed_mu_aux phi1 0 = true ∧ well_formed_closed_ex_aux phi1 0 = true
split; auto.
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 $ phi2)
m: nat
H0: S (size phi1 + size phi2) ≤ sz
H: m = sz

eval ρ ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi1 $ (fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi2) = eval (update_svar_val X (eval ρ psi) ρ) (phi1 $ phi2)
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 $ phi2)
m: nat
H0: S (size phi1 + size phi2) ≤ sz
H: m = sz

app_ext (eval ρ ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi1)) (eval ρ ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi2)) = app_ext (eval (update_svar_val X (eval ρ psi) ρ) phi1) (eval (update_svar_val X (eval ρ psi) ρ) phi2)
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 $ phi2)
m: nat
H0: S (size phi1 + size phi2) ≤ sz
H: m = sz

app_ext (eval (update_svar_val X (eval ρ psi) ρ) phi1) (eval ρ ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi2)) = app_ext (eval (update_svar_val X (eval ρ psi) ρ) phi1) (eval (update_svar_val X (eval ρ psi) ρ) phi2)
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 $ phi2)
m: nat
H0: S (size phi1 + size phi2) ≤ sz
H: m = sz
size phi1 ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 $ phi2)
m: nat
H0: S (size phi1 + size phi2) ≤ sz
H: m = sz
well_formed psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 $ phi2)
m: nat
H0: S (size phi1 + size phi2) ≤ sz
H: m = sz
well_formed_closed phi1
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 $ phi2)
m: nat
H0: S (size phi1 + size phi2) ≤ sz
H: m = sz

app_ext (eval (update_svar_val X (eval ρ psi) ρ) phi1) (eval (update_svar_val X (eval ρ psi) ρ) phi2) = app_ext (eval (update_svar_val X (eval ρ psi) ρ) phi1) (eval (update_svar_val X (eval ρ psi) ρ) phi2)
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 $ phi2)
m: nat
H0: S (size phi1 + size phi2) ≤ sz
H: m = sz
size phi2 ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 $ phi2)
m: nat
H0: S (size phi1 + size phi2) ≤ sz
H: m = sz
well_formed psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 $ phi2)
m: nat
H0: S (size phi1 + size phi2) ≤ sz
H: m = sz
well_formed_closed phi2
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 $ phi2)
m: nat
H0: S (size phi1 + size phi2) ≤ sz
H: m = sz
size phi1 ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 $ phi2)
m: nat
H0: S (size phi1 + size phi2) ≤ sz
H: m = sz
well_formed psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 $ phi2)
m: nat
H0: S (size phi1 + size phi2) ≤ sz
H: m = sz
well_formed_closed phi1
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 $ phi2)
m: nat
H0: S (size phi1 + size phi2) ≤ sz
H: m = sz

size phi2 ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 $ phi2)
m: nat
H0: S (size phi1 + size phi2) ≤ sz
H: m = sz
well_formed psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 $ phi2)
m: nat
H0: S (size phi1 + size phi2) ≤ sz
H: m = sz
well_formed_closed phi2
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 $ phi2)
m: nat
H0: S (size phi1 + size phi2) ≤ sz
H: m = sz
size phi1 ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 $ phi2)
m: nat
H0: S (size phi1 + size phi2) ≤ sz
H: m = sz
well_formed psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 $ phi2)
m: nat
H0: S (size phi1 + size phi2) ≤ sz
H: m = sz
well_formed_closed phi1
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 $ phi2)
m: nat
H0: S (size phi1 + size phi2) ≤ sz
H: m = sz

well_formed psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 $ phi2)
m: nat
H0: S (size phi1 + size phi2) ≤ sz
H: m = sz
well_formed_closed phi2
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 $ phi2)
m: nat
H0: S (size phi1 + size phi2) ≤ sz
H: m = sz
size phi1 ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 $ phi2)
m: nat
H0: S (size phi1 + size phi2) ≤ sz
H: m = sz
well_formed psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 $ phi2)
m: nat
H0: S (size phi1 + size phi2) ≤ sz
H: m = sz
well_formed_closed phi1
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 $ phi2)
m: nat
H0: S (size phi1 + size phi2) ≤ sz
H: m = sz

well_formed_closed phi2
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 $ phi2)
m: nat
H0: S (size phi1 + size phi2) ≤ sz
H: m = sz
size phi1 ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 $ phi2)
m: nat
H0: S (size phi1 + size phi2) ≤ sz
H: m = sz
well_formed psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 $ phi2)
m: nat
H0: S (size phi1 + size phi2) ≤ sz
H: m = sz
well_formed_closed phi1
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 $ phi2)
m: nat
H0: S (size phi1 + size phi2) ≤ sz
H: m = sz

well_formed_closed phi2
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc1: well_formed_closed_mu_aux (phi1 $ phi2) 0 = true
Hwfc2: well_formed_closed_ex_aux (phi1 $ phi2) 0 = true
m: nat
H0: S (size phi1 + size phi2) ≤ sz
H: m = sz

well_formed_closed phi2
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc1: well_formed_closed_mu_aux phi1 0 && well_formed_closed_mu_aux phi2 0 = true
Hwfc2: well_formed_closed_ex_aux phi1 0 && well_formed_closed_ex_aux phi2 0 = true
m: nat
H0: S (size phi1 + size phi2) ≤ sz
H: m = sz

well_formed_closed phi2
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc11: well_formed_closed_mu_aux phi1 0 = true
Hwfc12: well_formed_closed_mu_aux phi2 0 = true
Hwfc2: well_formed_closed_ex_aux phi1 0 && well_formed_closed_ex_aux phi2 0 = true
m: nat
H0: S (size phi1 + size phi2) ≤ sz
H: m = sz

well_formed_closed phi2
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc11: well_formed_closed_mu_aux phi1 0 = true
Hwfc12: well_formed_closed_mu_aux phi2 0 = true
Hwfc21: well_formed_closed_ex_aux phi1 0 = true
Hwfc22: well_formed_closed_ex_aux phi2 0 = true
m: nat
H0: S (size phi1 + size phi2) ≤ sz
H: m = sz

well_formed_closed phi2
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc11: well_formed_closed_mu_aux phi1 0 = true
Hwfc12: well_formed_closed_mu_aux phi2 0 = true
Hwfc21: well_formed_closed_ex_aux phi1 0 = true
Hwfc22: well_formed_closed_ex_aux phi2 0 = true
m: nat
H0: S (size phi1 + size phi2) ≤ sz
H: m = sz

well_formed_closed_mu_aux phi2 0 = true ∧ well_formed_closed_ex_aux phi2 0 = true
split; auto.
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 $ phi2)
m: nat
H0: S (size phi1 + size phi2) ≤ sz
H: m = sz

size phi1 ≤ sz
lia.
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 $ phi2)
m: nat
H0: S (size phi1 + size phi2) ≤ sz
H: m = sz

well_formed psi
auto.
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 $ phi2)
m: nat
H0: S (size phi1 + size phi2) ≤ sz
H: m = sz

well_formed_closed phi1
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc1: well_formed_closed_mu_aux (phi1 $ phi2) 0 = true
Hwfc2: well_formed_closed_ex_aux (phi1 $ phi2) 0 = true
m: nat
H0: S (size phi1 + size phi2) ≤ sz
H: m = sz

well_formed_closed phi1
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc1: well_formed_closed_mu_aux phi1 0 && well_formed_closed_mu_aux phi2 0 = true
Hwfc2: well_formed_closed_ex_aux phi1 0 && well_formed_closed_ex_aux phi2 0 = true
m: nat
H0: S (size phi1 + size phi2) ≤ sz
H: m = sz

well_formed_closed phi1
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc11: well_formed_closed_mu_aux phi1 0 = true
Hwfc12: well_formed_closed_mu_aux phi2 0 = true
Hwfc2: well_formed_closed_ex_aux phi1 0 && well_formed_closed_ex_aux phi2 0 = true
m: nat
H0: S (size phi1 + size phi2) ≤ sz
H: m = sz

well_formed_closed phi1
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc11: well_formed_closed_mu_aux phi1 0 = true
Hwfc12: well_formed_closed_mu_aux phi2 0 = true
Hwfc21: well_formed_closed_ex_aux phi1 0 = true
Hwfc22: well_formed_closed_ex_aux phi2 0 = true
m: nat
H0: S (size phi1 + size phi2) ≤ sz
H: m = sz

well_formed_closed phi1
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc11: well_formed_closed_mu_aux phi1 0 = true
Hwfc12: well_formed_closed_mu_aux phi2 0 = true
Hwfc21: well_formed_closed_ex_aux phi1 0 = true
Hwfc22: well_formed_closed_ex_aux phi2 0 = true
m: nat
H0: S (size phi1 + size phi2) ≤ sz
H: m = sz

well_formed_closed_mu_aux phi1 0 = true ∧ well_formed_closed_ex_aux phi1 0 = true
split; auto.
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 ---> phi2)
H0: size phi1 + size phi2 = sz

eval ρ ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi1 ---> (fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi2) = eval (update_svar_val X (eval ρ psi) ρ) (phi1 ---> phi2)
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 ---> phi2)
H0: size phi1 + size phi2 = sz

⊤ ∖ eval ρ ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi1) ∪ eval ρ ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi2) = ⊤ ∖ eval (update_svar_val X (eval ρ psi) ρ) phi1 ∪ eval (update_svar_val X (eval ρ psi) ρ) phi2
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 ---> phi2)
H0: size phi1 + size phi2 = sz

⊤ ∖ eval (update_svar_val X (eval ρ psi) ρ) phi1 ∪ eval ρ ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi2) = ⊤ ∖ eval (update_svar_val X (eval ρ psi) ρ) phi1 ∪ eval (update_svar_val X (eval ρ psi) ρ) phi2
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 ---> phi2)
H0: size phi1 + size phi2 = sz
size phi1 ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 ---> phi2)
H0: size phi1 + size phi2 = sz
well_formed psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 ---> phi2)
H0: size phi1 + size phi2 = sz
well_formed_closed phi1
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 ---> phi2)
H0: size phi1 + size phi2 = sz

⊤ ∖ eval (update_svar_val X (eval ρ psi) ρ) phi1 ∪ eval (update_svar_val X (eval ρ psi) ρ) phi2 = ⊤ ∖ eval (update_svar_val X (eval ρ psi) ρ) phi1 ∪ eval (update_svar_val X (eval ρ psi) ρ) phi2
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 ---> phi2)
H0: size phi1 + size phi2 = sz
size phi2 ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 ---> phi2)
H0: size phi1 + size phi2 = sz
well_formed psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 ---> phi2)
H0: size phi1 + size phi2 = sz
well_formed_closed phi2
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 ---> phi2)
H0: size phi1 + size phi2 = sz
size phi1 ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 ---> phi2)
H0: size phi1 + size phi2 = sz
well_formed psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 ---> phi2)
H0: size phi1 + size phi2 = sz
well_formed_closed phi1
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 ---> phi2)
H0: size phi1 + size phi2 = sz

size phi2 ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 ---> phi2)
H0: size phi1 + size phi2 = sz
well_formed psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 ---> phi2)
H0: size phi1 + size phi2 = sz
well_formed_closed phi2
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 ---> phi2)
H0: size phi1 + size phi2 = sz
size phi1 ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 ---> phi2)
H0: size phi1 + size phi2 = sz
well_formed psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 ---> phi2)
H0: size phi1 + size phi2 = sz
well_formed_closed phi1
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 ---> phi2)
H0: size phi1 + size phi2 = sz

well_formed psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 ---> phi2)
H0: size phi1 + size phi2 = sz
well_formed_closed phi2
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 ---> phi2)
H0: size phi1 + size phi2 = sz
size phi1 ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 ---> phi2)
H0: size phi1 + size phi2 = sz
well_formed psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 ---> phi2)
H0: size phi1 + size phi2 = sz
well_formed_closed phi1
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 ---> phi2)
H0: size phi1 + size phi2 = sz

well_formed_closed phi2
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 ---> phi2)
H0: size phi1 + size phi2 = sz
size phi1 ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 ---> phi2)
H0: size phi1 + size phi2 = sz
well_formed psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 ---> phi2)
H0: size phi1 + size phi2 = sz
well_formed_closed phi1
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 ---> phi2)
H0: size phi1 + size phi2 = sz

well_formed_closed phi2
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc1: well_formed_closed_mu_aux (phi1 ---> phi2) 0 = true
Hwfc2: well_formed_closed_ex_aux (phi1 ---> phi2) 0 = true
H0: size phi1 + size phi2 = sz

well_formed_closed phi2
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc1: well_formed_closed_mu_aux phi1 0 && well_formed_closed_mu_aux phi2 0 = true
Hwfc2: well_formed_closed_ex_aux phi1 0 && well_formed_closed_ex_aux phi2 0 = true
H0: size phi1 + size phi2 = sz

well_formed_closed phi2
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc11: well_formed_closed_mu_aux phi1 0 = true
Hwfc12: well_formed_closed_mu_aux phi2 0 = true
Hwfc2: well_formed_closed_ex_aux phi1 0 && well_formed_closed_ex_aux phi2 0 = true
H0: size phi1 + size phi2 = sz

well_formed_closed phi2
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc11: well_formed_closed_mu_aux phi1 0 = true
Hwfc12: well_formed_closed_mu_aux phi2 0 = true
Hwfc21: well_formed_closed_ex_aux phi1 0 = true
Hwfc22: well_formed_closed_ex_aux phi2 0 = true
H0: size phi1 + size phi2 = sz

well_formed_closed phi2
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc11: well_formed_closed_mu_aux phi1 0 = true
Hwfc12: well_formed_closed_mu_aux phi2 0 = true
Hwfc21: well_formed_closed_ex_aux phi1 0 = true
Hwfc22: well_formed_closed_ex_aux phi2 0 = true
H0: size phi1 + size phi2 = sz

well_formed_closed_mu_aux phi2 0 = true ∧ well_formed_closed_ex_aux phi2 0 = true
split; auto.
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 ---> phi2)
H0: size phi1 + size phi2 = sz

size phi1 ≤ sz
lia.
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 ---> phi2)
H0: size phi1 + size phi2 = sz

well_formed psi
auto.
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 ---> phi2)
H0: size phi1 + size phi2 = sz

well_formed_closed phi1
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc1: well_formed_closed_mu_aux (phi1 ---> phi2) 0 = true
Hwfc2: well_formed_closed_ex_aux (phi1 ---> phi2) 0 = true
H0: size phi1 + size phi2 = sz

well_formed_closed phi1
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc1: well_formed_closed_mu_aux phi1 0 && well_formed_closed_mu_aux phi2 0 = true
Hwfc2: well_formed_closed_ex_aux phi1 0 && well_formed_closed_ex_aux phi2 0 = true
H0: size phi1 + size phi2 = sz

well_formed_closed phi1
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc11: well_formed_closed_mu_aux phi1 0 = true
Hwfc12: well_formed_closed_mu_aux phi2 0 = true
Hwfc2: well_formed_closed_ex_aux phi1 0 && well_formed_closed_ex_aux phi2 0 = true
H0: size phi1 + size phi2 = sz

well_formed_closed phi1
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc11: well_formed_closed_mu_aux phi1 0 = true
Hwfc12: well_formed_closed_mu_aux phi2 0 = true
Hwfc21: well_formed_closed_ex_aux phi1 0 = true
Hwfc22: well_formed_closed_ex_aux phi2 0 = true
H0: size phi1 + size phi2 = sz

well_formed_closed phi1
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc11: well_formed_closed_mu_aux phi1 0 = true
Hwfc12: well_formed_closed_mu_aux phi2 0 = true
Hwfc21: well_formed_closed_ex_aux phi1 0 = true
Hwfc22: well_formed_closed_ex_aux phi2 0 = true
H0: size phi1 + size phi2 = sz

well_formed_closed_mu_aux phi1 0 = true ∧ well_formed_closed_ex_aux phi1 0 = true
split; auto.
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 ---> phi2)
m: nat
H0: S (size phi1 + size phi2) ≤ sz
H: m = sz

eval ρ ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi1 ---> (fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi2) = eval (update_svar_val X (eval ρ psi) ρ) (phi1 ---> phi2)
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 ---> phi2)
m: nat
H0: S (size phi1 + size phi2) ≤ sz
H: m = sz

⊤ ∖ eval ρ ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi1) ∪ eval ρ ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi2) = ⊤ ∖ eval (update_svar_val X (eval ρ psi) ρ) phi1 ∪ eval (update_svar_val X (eval ρ psi) ρ) phi2
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 ---> phi2)
m: nat
H0: S (size phi1 + size phi2) ≤ sz
H: m = sz

⊤ ∖ eval (update_svar_val X (eval ρ psi) ρ) phi1 ∪ eval ρ ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi2) = ⊤ ∖ eval (update_svar_val X (eval ρ psi) ρ) phi1 ∪ eval (update_svar_val X (eval ρ psi) ρ) phi2
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 ---> phi2)
m: nat
H0: S (size phi1 + size phi2) ≤ sz
H: m = sz
size phi1 ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 ---> phi2)
m: nat
H0: S (size phi1 + size phi2) ≤ sz
H: m = sz
well_formed psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 ---> phi2)
m: nat
H0: S (size phi1 + size phi2) ≤ sz
H: m = sz
well_formed_closed phi1
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 ---> phi2)
m: nat
H0: S (size phi1 + size phi2) ≤ sz
H: m = sz

⊤ ∖ eval (update_svar_val X (eval ρ psi) ρ) phi1 ∪ eval (update_svar_val X (eval ρ psi) ρ) phi2 = ⊤ ∖ eval (update_svar_val X (eval ρ psi) ρ) phi1 ∪ eval (update_svar_val X (eval ρ psi) ρ) phi2
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 ---> phi2)
m: nat
H0: S (size phi1 + size phi2) ≤ sz
H: m = sz
size phi2 ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 ---> phi2)
m: nat
H0: S (size phi1 + size phi2) ≤ sz
H: m = sz
well_formed psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 ---> phi2)
m: nat
H0: S (size phi1 + size phi2) ≤ sz
H: m = sz
well_formed_closed phi2
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 ---> phi2)
m: nat
H0: S (size phi1 + size phi2) ≤ sz
H: m = sz
size phi1 ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 ---> phi2)
m: nat
H0: S (size phi1 + size phi2) ≤ sz
H: m = sz
well_formed psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 ---> phi2)
m: nat
H0: S (size phi1 + size phi2) ≤ sz
H: m = sz
well_formed_closed phi1
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 ---> phi2)
m: nat
H0: S (size phi1 + size phi2) ≤ sz
H: m = sz

size phi2 ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 ---> phi2)
m: nat
H0: S (size phi1 + size phi2) ≤ sz
H: m = sz
well_formed psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 ---> phi2)
m: nat
H0: S (size phi1 + size phi2) ≤ sz
H: m = sz
well_formed_closed phi2
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 ---> phi2)
m: nat
H0: S (size phi1 + size phi2) ≤ sz
H: m = sz
size phi1 ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 ---> phi2)
m: nat
H0: S (size phi1 + size phi2) ≤ sz
H: m = sz
well_formed psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 ---> phi2)
m: nat
H0: S (size phi1 + size phi2) ≤ sz
H: m = sz
well_formed_closed phi1
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 ---> phi2)
m: nat
H0: S (size phi1 + size phi2) ≤ sz
H: m = sz

well_formed psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 ---> phi2)
m: nat
H0: S (size phi1 + size phi2) ≤ sz
H: m = sz
well_formed_closed phi2
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 ---> phi2)
m: nat
H0: S (size phi1 + size phi2) ≤ sz
H: m = sz
size phi1 ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 ---> phi2)
m: nat
H0: S (size phi1 + size phi2) ≤ sz
H: m = sz
well_formed psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 ---> phi2)
m: nat
H0: S (size phi1 + size phi2) ≤ sz
H: m = sz
well_formed_closed phi1
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 ---> phi2)
m: nat
H0: S (size phi1 + size phi2) ≤ sz
H: m = sz

well_formed_closed phi2
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 ---> phi2)
m: nat
H0: S (size phi1 + size phi2) ≤ sz
H: m = sz
size phi1 ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 ---> phi2)
m: nat
H0: S (size phi1 + size phi2) ≤ sz
H: m = sz
well_formed psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 ---> phi2)
m: nat
H0: S (size phi1 + size phi2) ≤ sz
H: m = sz
well_formed_closed phi1
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 ---> phi2)
m: nat
H0: S (size phi1 + size phi2) ≤ sz
H: m = sz

well_formed_closed phi2
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc1: well_formed_closed_mu_aux (phi1 ---> phi2) 0 = true
Hwfc2: well_formed_closed_ex_aux (phi1 ---> phi2) 0 = true
m: nat
H0: S (size phi1 + size phi2) ≤ sz
H: m = sz

well_formed_closed phi2
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc1: well_formed_closed_mu_aux phi1 0 && well_formed_closed_mu_aux phi2 0 = true
Hwfc2: well_formed_closed_ex_aux phi1 0 && well_formed_closed_ex_aux phi2 0 = true
m: nat
H0: S (size phi1 + size phi2) ≤ sz
H: m = sz

well_formed_closed phi2
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc11: well_formed_closed_mu_aux phi1 0 = true
Hwfc12: well_formed_closed_mu_aux phi2 0 = true
Hwfc2: well_formed_closed_ex_aux phi1 0 && well_formed_closed_ex_aux phi2 0 = true
m: nat
H0: S (size phi1 + size phi2) ≤ sz
H: m = sz

well_formed_closed phi2
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc11: well_formed_closed_mu_aux phi1 0 = true
Hwfc12: well_formed_closed_mu_aux phi2 0 = true
Hwfc21: well_formed_closed_ex_aux phi1 0 = true
Hwfc22: well_formed_closed_ex_aux phi2 0 = true
m: nat
H0: S (size phi1 + size phi2) ≤ sz
H: m = sz

well_formed_closed phi2
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc11: well_formed_closed_mu_aux phi1 0 = true
Hwfc12: well_formed_closed_mu_aux phi2 0 = true
Hwfc21: well_formed_closed_ex_aux phi1 0 = true
Hwfc22: well_formed_closed_ex_aux phi2 0 = true
m: nat
H0: S (size phi1 + size phi2) ≤ sz
H: m = sz

well_formed_closed_mu_aux phi2 0 = true ∧ well_formed_closed_ex_aux phi2 0 = true
split; auto.
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 ---> phi2)
m: nat
H0: S (size phi1 + size phi2) ≤ sz
H: m = sz

size phi1 ≤ sz
lia.
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 ---> phi2)
m: nat
H0: S (size phi1 + size phi2) ≤ sz
H: m = sz

well_formed psi
auto.
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (phi1 ---> phi2)
m: nat
H0: S (size phi1 + size phi2) ≤ sz
H: m = sz

well_formed_closed phi1
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc1: well_formed_closed_mu_aux (phi1 ---> phi2) 0 = true
Hwfc2: well_formed_closed_ex_aux (phi1 ---> phi2) 0 = true
m: nat
H0: S (size phi1 + size phi2) ≤ sz
H: m = sz

well_formed_closed phi1
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc1: well_formed_closed_mu_aux phi1 0 && well_formed_closed_mu_aux phi2 0 = true
Hwfc2: well_formed_closed_ex_aux phi1 0 && well_formed_closed_ex_aux phi2 0 = true
m: nat
H0: S (size phi1 + size phi2) ≤ sz
H: m = sz

well_formed_closed phi1
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc11: well_formed_closed_mu_aux phi1 0 = true
Hwfc12: well_formed_closed_mu_aux phi2 0 = true
Hwfc2: well_formed_closed_ex_aux phi1 0 && well_formed_closed_ex_aux phi2 0 = true
m: nat
H0: S (size phi1 + size phi2) ≤ sz
H: m = sz

well_formed_closed phi1
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc11: well_formed_closed_mu_aux phi1 0 = true
Hwfc12: well_formed_closed_mu_aux phi2 0 = true
Hwfc21: well_formed_closed_ex_aux phi1 0 = true
Hwfc22: well_formed_closed_ex_aux phi2 0 = true
m: nat
H0: S (size phi1 + size phi2) ≤ sz
H: m = sz

well_formed_closed phi1
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi1, phi2, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi1 + size phi2) ≤ S sz
Hwf: well_formed psi
Hwfc11: well_formed_closed_mu_aux phi1 0 = true
Hwfc12: well_formed_closed_mu_aux phi2 0 = true
Hwfc21: well_formed_closed_ex_aux phi1 0 = true
Hwfc22: well_formed_closed_ex_aux phi2 0 = true
m: nat
H0: S (size phi1 + size phi2) ≤ sz
H: m = sz

well_formed_closed_mu_aux phi1 0 = true ∧ well_formed_closed_ex_aux phi1 0 = true
split; auto.
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz

eval ρ (ex , (fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) (ex , phi)
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz

(let x := fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi) in propset_fa_union (λ e : M, let ρ' := update_evar_val x e ρ in eval ρ' ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x0 => patt_free_evar x0 | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x0 => patt_bound_evar x0 | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0↦x})) = (let x := fresh_evar phi in propset_fa_union (λ e : M, let ρ' := update_evar_val x e (update_svar_val X (eval ρ psi) ρ) in eval ρ' phi^{evar:0↦x}))
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz

propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) e ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0↦fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)}) = propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar phi) e (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi})
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz

c : M, eval (update_evar_val (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0↦fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)} = eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c: M

eval (update_evar_val (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0↦fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)} = eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c: M

eval (update_evar_val (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0↦fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)} ⊆ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi} ⊆ eval (update_evar_val (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0↦fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c: M

( x : M, x ∈ eval (update_evar_val (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x0 => patt_free_evar x0 | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x0 => patt_bound_evar x0 | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x0 => patt_free_evar x0 | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x0 => patt_bound_evar x0 | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0↦fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x0 => patt_free_evar x0 | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x0 => patt_bound_evar x0 | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)} → x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}) ∧ ( x : M, x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi} → x ∈ eval (update_evar_val (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x0 => patt_free_evar x0 | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x0 => patt_bound_evar x0 | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x0 => patt_free_evar x0 | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x0 => patt_bound_evar x0 | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0↦fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x0 => patt_free_evar x0 | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x0 => patt_bound_evar x0 | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)})
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c: M

x : M, x ∈ eval (update_evar_val (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x0 => patt_free_evar x0 | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x0 => patt_bound_evar x0 | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x0 => patt_free_evar x0 | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x0 => patt_bound_evar x0 | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0↦fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x0 => patt_free_evar x0 | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x0 => patt_bound_evar x0 | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)} → x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c: M
x : M, x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi} → x ∈ eval (update_evar_val (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x0 => patt_free_evar x0 | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x0 => patt_bound_evar x0 | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x0 => patt_free_evar x0 | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x0 => patt_bound_evar x0 | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0↦ fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x0 => patt_free_evar x0 | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x0 => patt_bound_evar x0 | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c: M

x : M, x ∈ eval (update_evar_val (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x0 => patt_free_evar x0 | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x0 => patt_bound_evar x0 | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x0 => patt_free_evar x0 | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x0 => patt_bound_evar x0 | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0↦fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x0 => patt_free_evar x0 | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x0 => patt_bound_evar x0 | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)} → x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H: x ∈ eval (update_evar_val (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0↦ fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)}

x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H: x ∈ eval (update_evar_val (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0↦ fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)}
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi

x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H: x ∈ eval (update_evar_val (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0↦ fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)}
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)

x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H: x ∈ eval (update_evar_val (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0↦ fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)}
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)

evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H: x ∈ eval (update_evar_val (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0↦ fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)}
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H: x ∈ eval (update_evar_val (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0↦ fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)}
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)

evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
apply set_evar_fresh_is_fresh.
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H: x ∈ eval (update_evar_val (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0↦ fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)}
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]

x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H: x ∈ eval (update_evar_val (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0↦ fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)}
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]

fresh ∉ B
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H: x ∈ eval (update_evar_val (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0↦ fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)}
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
H2: fresh ∉ B
x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H: x ∈ eval (update_evar_val (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0↦ fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)}
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]

fresh ∉ B
signature: Signature
M: Model
phi: Pattern
IHsz: (phi0 psi : Pattern) (X : svar) (ρ : Valuation), size phi0 ≤ size phi → well_formed psi → well_formed_closed phi0 → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi0) = eval (update_svar_val X (eval ρ psi) ρ) phi0
psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S (size phi)
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
c, x: M
H: x ∈ eval (update_evar_val (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0↦ fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)}
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]

evar_fresh (elements (free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi)) ∉ free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
apply set_evar_fresh_is_fresh'.
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H: x ∈ eval (update_evar_val (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0↦ fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)}
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
H2: fresh ∉ B

x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H: x ∈ eval (update_evar_val (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0↦ fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)}
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
H2: evar_fresh (elements B) ∉ B

x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H: x ∈ eval (update_evar_val (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0↦ fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)}
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
H2: evar_fresh (elements (free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi)) ∉ free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi

x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H: x ∈ eval (update_evar_val (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0↦ fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)}
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
H2: (evar_fresh (elements (free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi)) ∉ free_evars phi^[[svar:X↦psi]] ∪ free_evars phi) ∧ evar_fresh (elements (free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi)) ∉ free_evars psi

x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H: x ∈ eval (update_evar_val (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0↦ fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)}
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
H2: evar_fresh (elements (free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi)) ∉ free_evars phi^[[svar:X↦psi]] ∪ free_evars phi
H3: evar_fresh (elements (free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi)) ∉ free_evars psi

x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H: x ∈ eval (update_evar_val (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0↦ fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)}
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
H2: (evar_fresh (elements (free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi)) ∉ free_evars phi^[[svar:X↦psi]]) ∧ evar_fresh (elements (free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi)) ∉ free_evars phi
H3: evar_fresh (elements (free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi)) ∉ free_evars psi

x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H: x ∈ eval (update_evar_val (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0↦ fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)}
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
H2: evar_fresh (elements (free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi)) ∉ free_evars phi^[[svar:X↦psi]]
H4: evar_fresh (elements (free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi)) ∉ free_evars phi
H3: evar_fresh (elements (free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi)) ∉ free_evars psi

x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H: x ∈ eval (update_evar_val (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0↦ fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)}
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
H2: evar_fresh (elements B) ∉ free_evars phi^[[svar:X↦psi]]
H4: evar_fresh (elements B) ∉ free_evars phi
H3: evar_fresh (elements B) ∉ free_evars psi

x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H: x ∈ eval (update_evar_val (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0↦ fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)}
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi

x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H: x ∈ eval (update_evar_val (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0↦ fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)}
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi

evar_is_fresh_in fresh phi^[[svar:X↦psi]]
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H: x ∈ eval (update_evar_val (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0↦ fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)}
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H: x ∈ eval (update_evar_val (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0↦ fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)}
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi

evar_is_fresh_in fresh phi^[[svar:X↦psi]]
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H: x ∈ eval (update_evar_val (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0↦ fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)}
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi

fresh ∉ free_evars phi^[[svar:X↦psi]]
assumption.
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H: x ∈ eval (update_evar_val (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0↦ fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)}
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]

x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H: x ∈ eval (update_evar_val ?y c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0?y}

x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H: x ∈ eval (update_evar_val (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0↦ fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)}
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
evar_is_fresh_in (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H: x ∈ eval (update_evar_val (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0↦ fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)}
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
evar_is_fresh_in ?y ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H: x ∈ eval (update_evar_val (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0↦ fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)}
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]

evar_is_fresh_in ?y ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)
eassumption.
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H: x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0fresh}

x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H: x ∈ eval (update_evar_val (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0↦ fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)}
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
evar_is_fresh_in (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H: x ∈ eval (update_evar_val (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0↦ fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)}
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]

evar_is_fresh_in (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)
assumption.
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H: x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0fresh}

x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H: x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0fresh}

evar_is_fresh_in fresh phi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H: x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0fresh}
H6: evar_is_fresh_in fresh phi
x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H: x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0fresh}

evar_is_fresh_in fresh phi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H: x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0fresh}

fresh ∉ free_evars phi
assumption.
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H: x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0fresh}
H6: evar_is_fresh_in fresh phi

x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H: x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0fresh}
H6: evar_is_fresh_in fresh phi

evar_is_fresh_in (fresh_evar phi) phi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H: x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0fresh}
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi
x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H: x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0fresh}
H6: evar_is_fresh_in fresh phi

evar_is_fresh_in (fresh_evar phi) phi
apply set_evar_fresh_is_fresh.
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H: x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0fresh}
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi

x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H: x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0fresh}
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi
HFresh:= eval_fresh_evar_open ?x ?y c 0 (update_svar_val X (eval ρ psi) ρ) ?Goal3 ?Goal4: eval (update_evar_val ?x c (update_svar_val X (eval ρ psi) ρ)) ^{evar:0?x} = eval (update_evar_val ?y c (update_svar_val X (eval ρ psi) ρ)) ^{evar:0?y}

x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H: x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0fresh}
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi
HFresh:= eval_fresh_evar_open phi (fresh_evar phi) ?y c 0 (update_svar_val X (eval ρ psi) ρ) ?Goal3 ?Goal4: eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi} = eval (update_evar_val ?y c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0?y}

x ∈ eval (update_evar_val ?y c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0?y}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H: x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0fresh}
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi

x ∈ eval (update_evar_val ?y c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0?y}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H: x ∈ eval (update_evar_val fresh c ρ) phi^[[svar:X↦psi]]^{evar:0fresh}
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi

x ∈ eval (update_evar_val ?y c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0?y}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H: x ∈ eval (update_evar_val fresh c ρ) phi^[[svar:X↦psi]]^{evar:0fresh}
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi
H8: well_formed_closed phi^{evar:0fresh} → eval (update_evar_val fresh c ρ) phi^{evar:0fresh}^[[svar:X↦psi]] = eval (update_svar_val X (eval (update_evar_val fresh c ρ) psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}

x ∈ eval (update_evar_val ?y c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0?y}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H: x ∈ eval (update_evar_val fresh c ρ) phi^[[svar:X↦psi]]^{evar:0fresh}
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi
H8: well_formed_closed phi^{evar:0fresh} → eval (update_evar_val fresh c ρ) phi^{evar:0fresh}^[[svar:X↦psi]] = eval (update_svar_val X (eval (update_evar_val fresh c ρ) psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}

well_formed_closed phi^{evar:0fresh}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H: x ∈ eval (update_evar_val fresh c ρ) phi^[[svar:X↦psi]]^{evar:0fresh}
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi
H8: eval (update_evar_val fresh c ρ) phi^{evar:0fresh}^[[svar:X↦psi]] = eval (update_svar_val X (eval (update_evar_val fresh c ρ) psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}
x ∈ eval (update_evar_val ?y c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0?y}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H: x ∈ eval (update_evar_val fresh c ρ) phi^[[svar:X↦psi]]^{evar:0fresh}
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi
H8: well_formed_closed phi^{evar:0fresh} → eval (update_evar_val fresh c ρ) phi^{evar:0fresh}^[[svar:X↦psi]] = eval (update_svar_val X (eval (update_evar_val fresh c ρ) psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}

well_formed_closed phi^{evar:0fresh}
wf_auto2.
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H: x ∈ eval (update_evar_val fresh c ρ) phi^[[svar:X↦psi]]^{evar:0fresh}
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi
H8: eval (update_evar_val fresh c ρ) phi^{evar:0fresh}^[[svar:X↦psi]] = eval (update_svar_val X (eval (update_evar_val fresh c ρ) psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}

x ∈ eval (update_evar_val ?y c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0?y}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H: x ∈ eval (update_evar_val fresh c ρ) phi^[[svar:X↦psi]]^{evar:0fresh}
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi
H8: eval (update_evar_val fresh c ρ) phi^{evar:0fresh}^[[svar:X↦psi]] = eval (update_svar_val X (eval (update_evar_val fresh c ρ) psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}
H9: evar_is_fresh_in fresh psi → eval (update_evar_val fresh c ρ) psi = eval ρ psi

x ∈ eval (update_evar_val ?y c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0?y}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H: x ∈ eval (update_evar_val fresh c ρ) phi^[[svar:X↦psi]]^{evar:0fresh}
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi
H8: eval (update_evar_val fresh c ρ) phi^{evar:0fresh}^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}
H9: evar_is_fresh_in fresh psi → eval (update_evar_val fresh c ρ) psi = eval ρ psi

x ∈ eval (update_evar_val ?y c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0?y}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H: x ∈ eval (update_evar_val fresh c ρ) phi^[[svar:X↦psi]]^{evar:0fresh}
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi
H8: eval (update_evar_val fresh c ρ) phi^{evar:0fresh}^[[svar:X↦psi]] = eval (update_svar_val X (eval (update_evar_val fresh c ρ) psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}
H9: evar_is_fresh_in fresh psi → eval (update_evar_val fresh c ρ) psi = eval ρ psi
evar_is_fresh_in fresh psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H: x ∈ eval (update_evar_val fresh c ρ) phi^[[svar:X↦psi]]^{evar:0fresh}
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi
H8: eval (update_evar_val fresh c ρ) phi^{evar:0fresh}^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}

x ∈ eval (update_evar_val ?y c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0?y}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H: x ∈ eval (update_evar_val fresh c ρ) phi^[[svar:X↦psi]]^{evar:0fresh}
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi
H8: eval (update_evar_val fresh c ρ) phi^{evar:0fresh}^[[svar:X↦psi]] = eval (update_svar_val X (eval (update_evar_val fresh c ρ) psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}
H9: evar_is_fresh_in fresh psi → eval (update_evar_val fresh c ρ) psi = eval ρ psi
evar_is_fresh_in fresh psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)
B: EVarSet
HeqB: B = free_evars ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi) ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)
H: x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0fresh}
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi
H8: eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}

x ∈ eval (update_evar_val ?y c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0?y}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H: x ∈ eval (update_evar_val fresh c ρ) phi^[[svar:X↦psi]]^{evar:0fresh}
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi
H8: eval (update_evar_val fresh c ρ) phi^{evar:0fresh}^[[svar:X↦psi]] = eval (update_svar_val X (eval (update_evar_val fresh c ρ) psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}
H9: evar_is_fresh_in fresh psi → eval (update_evar_val fresh c ρ) psi = eval ρ psi
evar_is_fresh_in fresh psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)
B: EVarSet
HeqB: B = free_evars ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi) ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)
H: x ∈ eval (update_evar_val fresh c ρ) phi^{evar:0fresh}^[[svar:X↦psi]]
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi
H8: eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}

x ∈ eval (update_evar_val ?y c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0?y}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)
B: EVarSet
HeqB: B = free_evars ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi) ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)
H: x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0fresh}
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi
H8: eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}
well_formed_closed_ex_aux psi 0
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)
B: EVarSet
HeqB: B = free_evars ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi) ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)
H: x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0fresh}
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi
H8: eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}
evar_is_fresh_in fresh phi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)
B: EVarSet
HeqB: B = free_evars ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi) ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)
H: x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0fresh}
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi
H8: eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}
evar_is_fresh_in fresh phi^[[svar:X↦psi]]
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H: x ∈ eval (update_evar_val fresh c ρ) phi^[[svar:X↦psi]]^{evar:0fresh}
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi
H8: eval (update_evar_val fresh c ρ) phi^{evar:0fresh}^[[svar:X↦psi]] = eval (update_svar_val X (eval (update_evar_val fresh c ρ) psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}
H9: evar_is_fresh_in fresh psi → eval (update_evar_val fresh c ρ) psi = eval ρ psi
evar_is_fresh_in fresh psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)
B: EVarSet
HeqB: B = free_evars ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi) ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)
H: x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh})
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi
H8: eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}

x ∈ eval (update_evar_val ?y c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0?y}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)
B: EVarSet
HeqB: B = free_evars ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi) ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)
H: x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0fresh}
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi
H8: eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}
well_formed_closed_ex_aux psi 0
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)
B: EVarSet
HeqB: B = free_evars ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi) ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)
H: x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0fresh}
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi
H8: eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}
evar_is_fresh_in fresh phi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)
B: EVarSet
HeqB: B = free_evars ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi) ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)
H: x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0fresh}
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi
H8: eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}
evar_is_fresh_in fresh phi^[[svar:X↦psi]]
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H: x ∈ eval (update_evar_val fresh c ρ) phi^[[svar:X↦psi]]^{evar:0fresh}
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi
H8: eval (update_evar_val fresh c ρ) phi^{evar:0fresh}^[[svar:X↦psi]] = eval (update_svar_val X (eval (update_evar_val fresh c ρ) psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}
H9: evar_is_fresh_in fresh psi → eval (update_evar_val fresh c ρ) psi = eval ρ psi
evar_is_fresh_in fresh psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)
B: EVarSet
HeqB: B = free_evars ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi) ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)
H: x ∈ eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi
H8: eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}

x ∈ eval (update_evar_val ?y c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0?y}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)
B: EVarSet
HeqB: B = free_evars ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi) ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)
H: x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0fresh}
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi
H8: eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}
well_formed_closed_ex_aux psi 0
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)
B: EVarSet
HeqB: B = free_evars ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi) ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)
H: x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0fresh}
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi
H8: eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}
evar_is_fresh_in fresh phi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)
B: EVarSet
HeqB: B = free_evars ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi) ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)
H: x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0fresh}
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi
H8: eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}
evar_is_fresh_in fresh phi^[[svar:X↦psi]]
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H: x ∈ eval (update_evar_val fresh c ρ) phi^[[svar:X↦psi]]^{evar:0fresh}
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi
H8: eval (update_evar_val fresh c ρ) phi^{evar:0fresh}^[[svar:X↦psi]] = eval (update_svar_val X (eval (update_evar_val fresh c ρ) psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}
H9: evar_is_fresh_in fresh psi → eval (update_evar_val fresh c ρ) psi = eval ρ psi
evar_is_fresh_in fresh psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)
B: EVarSet
HeqB: B = free_evars ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi) ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)
H: x ∈ eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi
H8: eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}

x ∈ eval (update_evar_val ?y c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0?y}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)
B: EVarSet
HeqB: B = free_evars ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi) ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)
H: x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0fresh}
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi
H8: eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}
well_formed_closed_ex_aux psi 0
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)
B: EVarSet
HeqB: B = free_evars ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi) ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)
H: x ∈ eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi
H8: eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}

x ∈ eval (update_evar_val ?y c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0?y}
exact H.
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)
B: EVarSet
HeqB: B = free_evars ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi) ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)
H: x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0fresh}
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi
H8: eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}

well_formed_closed_ex_aux psi 0
wf_auto2.
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c: M

x : M, x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi} → x ∈ eval (update_evar_val (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x0 => patt_free_evar x0 | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x0 => patt_bound_evar x0 | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x0 => patt_free_evar x0 | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x0 => patt_bound_evar x0 | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0↦fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x0 => patt_free_evar x0 | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x0 => patt_bound_evar x0 | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H: x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}

x ∈ eval (update_evar_val (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0↦fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H: x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi

x ∈ eval (update_evar_val (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0↦fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H: x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)

x ∈ eval (update_evar_val (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0↦fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H: x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)

evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H: x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
x ∈ eval (update_evar_val (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0↦ fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H: x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)

evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
apply set_evar_fresh_is_fresh.
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H: x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]

x ∈ eval (update_evar_val (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0↦fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H: x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]

fresh ∉ B
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H: x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
H2: fresh ∉ B
x ∈ eval (update_evar_val (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0↦ fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H: x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]

fresh ∉ B
signature: Signature
M: Model
phi: Pattern
IHsz: (phi0 psi : Pattern) (X : svar) (ρ : Valuation), size phi0 ≤ size phi → well_formed psi → well_formed_closed phi0 → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi0) = eval (update_svar_val X (eval ρ psi) ρ) phi0
psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S (size phi)
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
c, x: M
H: x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]

evar_fresh (elements (free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi)) ∉ free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
apply set_evar_fresh_is_fresh'.
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H: x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
H2: fresh ∉ B

x ∈ eval (update_evar_val (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0↦fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H: x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
H2: evar_fresh (elements B) ∉ B

x ∈ eval (update_evar_val (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0↦fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H: x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
H2: evar_fresh (elements (free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi)) ∉ free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi

x ∈ eval (update_evar_val (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0↦fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H: x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
H2: (evar_fresh (elements (free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi)) ∉ free_evars phi^[[svar:X↦psi]] ∪ free_evars phi) ∧ evar_fresh (elements (free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi)) ∉ free_evars psi

x ∈ eval (update_evar_val (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0↦fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H: x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
H2: evar_fresh (elements (free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi)) ∉ free_evars phi^[[svar:X↦psi]] ∪ free_evars phi
H3: evar_fresh (elements (free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi)) ∉ free_evars psi

x ∈ eval (update_evar_val (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0↦fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H: x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
H2: (evar_fresh (elements (free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi)) ∉ free_evars phi^[[svar:X↦psi]]) ∧ evar_fresh (elements (free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi)) ∉ free_evars phi
H3: evar_fresh (elements (free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi)) ∉ free_evars psi

x ∈ eval (update_evar_val (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0↦fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H: x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
H2: evar_fresh (elements (free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi)) ∉ free_evars phi^[[svar:X↦psi]]
H4: evar_fresh (elements (free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi)) ∉ free_evars phi
H3: evar_fresh (elements (free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi)) ∉ free_evars psi

x ∈ eval (update_evar_val (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0↦fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H: x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
H2: evar_fresh (elements B) ∉ free_evars phi^[[svar:X↦psi]]
H4: evar_fresh (elements B) ∉ free_evars phi
H3: evar_fresh (elements B) ∉ free_evars psi

x ∈ eval (update_evar_val (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0↦fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H: x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi

x ∈ eval (update_evar_val (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0↦fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H: x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi

evar_is_fresh_in fresh phi^[[svar:X↦psi]]
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H: x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
x ∈ eval (update_evar_val (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0↦ fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H: x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi

evar_is_fresh_in fresh phi^[[svar:X↦psi]]
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H: x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi

fresh ∉ free_evars phi^[[svar:X↦psi]]
assumption.
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H: x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]

x ∈ eval (update_evar_val (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0↦fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H: x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]

x ∈ eval (update_evar_val ?y c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0?y}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H: x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
evar_is_fresh_in (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H: x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
evar_is_fresh_in ?y ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H: x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]

evar_is_fresh_in ?y ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)
eassumption.
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H: x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]

x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0fresh}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H: x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
evar_is_fresh_in (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H: x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]

evar_is_fresh_in (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)
assumption.
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H: x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]

x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0fresh}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H: x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]

evar_is_fresh_in fresh phi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H: x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H6: evar_is_fresh_in fresh phi
x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0fresh}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H: x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]

evar_is_fresh_in fresh phi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H: x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]

fresh ∉ free_evars phi
assumption.
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H: x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H6: evar_is_fresh_in fresh phi

x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0fresh}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H: x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H6: evar_is_fresh_in fresh phi

evar_is_fresh_in (fresh_evar phi) phi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H: x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi
x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0fresh}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H: x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H6: evar_is_fresh_in fresh phi

evar_is_fresh_in (fresh_evar phi) phi
apply set_evar_fresh_is_fresh.
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H: x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi

x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0fresh}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H: x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi
HFresh:= eval_fresh_evar_open ?x ?y c 0 (update_svar_val X (eval ρ psi) ρ) ?Goal6 ?Goal7: eval (update_evar_val ?x c (update_svar_val X (eval ρ psi) ρ)) ^{evar:0?x} = eval (update_evar_val ?y c (update_svar_val X (eval ρ psi) ρ)) ^{evar:0?y}

x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0fresh}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi
H: x ∈ eval (update_evar_val ?y c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0?y}
HFresh:= eval_fresh_evar_open phi (fresh_evar phi) ?y c 0 (update_svar_val X (eval ρ psi) ρ) ?Goal6 ?Goal7: eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi} = eval (update_evar_val ?y c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0?y}

x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0fresh}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi
H: x ∈ eval (update_evar_val ?y c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0?y}

x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0fresh}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi
H: x ∈ eval (update_evar_val ?y c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0?y}
e:= IHsz phi^{evar:0fresh} psi X (update_evar_val fresh c ρ) ?Goal8 ?Goal9: well_formed_closed phi^{evar:0fresh} → eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval (update_evar_val fresh c ρ) psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}

x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0fresh}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi
H: x ∈ eval (update_evar_val ?y c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0?y}
e:= IHsz phi^{evar:0fresh} psi X (update_evar_val fresh c ρ) ?Goal8 ?Goal9: well_formed_closed phi^{evar:0fresh} → eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval (update_evar_val fresh c ρ) psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}
e0:= eval_free_evar_independent ρ fresh c psi: evar_is_fresh_in fresh psi → eval (update_evar_val fresh c ρ) psi = eval ρ psi

x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0fresh}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi
H: x ∈ eval (update_evar_val ?y c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0?y}
e: well_formed_closed phi^{evar:0fresh} → eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}
e0:= eval_free_evar_independent ρ fresh c psi: evar_is_fresh_in fresh psi → eval (update_evar_val fresh c ρ) psi = eval ρ psi

x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0fresh}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi
H: x ∈ eval (update_evar_val ?y c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0?y}
e:= IHsz phi^{evar:0fresh} psi X (update_evar_val fresh c ρ) ?Goal8 ?Goal9: well_formed_closed phi^{evar:0fresh} → eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval (update_evar_val fresh c ρ) psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}
e0:= eval_free_evar_independent ρ fresh c psi: evar_is_fresh_in fresh psi → eval (update_evar_val fresh c ρ) psi = eval ρ psi
evar_is_fresh_in fresh psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi
H: x ∈ eval (update_evar_val ?y c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0?y}
e: well_formed_closed phi^{evar:0fresh} → eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}

x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0fresh}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi
H: x ∈ eval (update_evar_val ?y c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0?y}
e:= IHsz phi^{evar:0fresh} psi X (update_evar_val fresh c ρ) ?Goal8 ?Goal9: well_formed_closed phi^{evar:0fresh} → eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval (update_evar_val fresh c ρ) psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}
e0:= eval_free_evar_independent ρ fresh c psi: evar_is_fresh_in fresh psi → eval (update_evar_val fresh c ρ) psi = eval ρ psi
evar_is_fresh_in fresh psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi
H: x ∈ eval (update_evar_val ?y c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0?y}
e: well_formed_closed phi^{evar:0fresh} → eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}

x ∈ eval (update_evar_val fresh c ρ) phi^[[svar:X↦psi]]^{evar:0fresh}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi
H: x ∈ eval (update_evar_val ?y c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0?y}
e:= IHsz phi^{evar:0fresh} psi X (update_evar_val fresh c ρ) ?Goal8 ?Goal9: well_formed_closed phi^{evar:0fresh} → eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval (update_evar_val fresh c ρ) psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}
e0:= eval_free_evar_independent ρ fresh c psi: evar_is_fresh_in fresh psi → eval (update_evar_val fresh c ρ) psi = eval ρ psi
evar_is_fresh_in fresh psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi
H: x ∈ eval (update_evar_val ?y c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0?y}
e: well_formed_closed phi^{evar:0fresh} → eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}

x ∈ eval (update_evar_val fresh c ρ) phi^{evar:0fresh}^[[svar:X↦psi]]
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi
H: x ∈ eval (update_evar_val ?y c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0?y}
e: well_formed_closed phi^{evar:0fresh} → eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}
well_formed_closed_ex_aux psi 0
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi
H: x ∈ eval (update_evar_val ?y c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0?y}
e: well_formed_closed phi^{evar:0fresh} → eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}
evar_is_fresh_in fresh phi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi
H: x ∈ eval (update_evar_val ?y c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0?y}
e: well_formed_closed phi^{evar:0fresh} → eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}
evar_is_fresh_in fresh phi^[[svar:X↦psi]]
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi
H: x ∈ eval (update_evar_val ?y c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0?y}
e:= IHsz phi^{evar:0fresh} psi X (update_evar_val fresh c ρ) ?Goal8 ?Goal9: well_formed_closed phi^{evar:0fresh} → eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval (update_evar_val fresh c ρ) psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}
e0:= eval_free_evar_independent ρ fresh c psi: evar_is_fresh_in fresh psi → eval (update_evar_val fresh c ρ) psi = eval ρ psi
evar_is_fresh_in fresh psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi
H: x ∈ eval (update_evar_val ?y c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0?y}
e: well_formed_closed phi^{evar:0fresh} → eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}

x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh})
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi
H: x ∈ eval (update_evar_val ?y c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0?y}
e: well_formed_closed phi^{evar:0fresh} → eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}
well_formed_closed_ex_aux psi 0
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi
H: x ∈ eval (update_evar_val ?y c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0?y}
e: well_formed_closed phi^{evar:0fresh} → eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}
evar_is_fresh_in fresh phi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi
H: x ∈ eval (update_evar_val ?y c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0?y}
e: well_formed_closed phi^{evar:0fresh} → eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}
evar_is_fresh_in fresh phi^[[svar:X↦psi]]
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi
H: x ∈ eval (update_evar_val ?y c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0?y}
e:= IHsz phi^{evar:0fresh} psi X (update_evar_val fresh c ρ) ?Goal8 ?Goal9: well_formed_closed phi^{evar:0fresh} → eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval (update_evar_val fresh c ρ) psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}
e0:= eval_free_evar_independent ρ fresh c psi: evar_is_fresh_in fresh psi → eval (update_evar_val fresh c ρ) psi = eval ρ psi
evar_is_fresh_in fresh psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi
H: x ∈ eval (update_evar_val ?y c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0?y}
e: well_formed_closed phi^{evar:0fresh} → eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}

x ∈ eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi
H: x ∈ eval (update_evar_val ?y c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0?y}
e: well_formed_closed phi^{evar:0fresh} → eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}
well_formed_closed phi^{evar:0fresh}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi
H: x ∈ eval (update_evar_val ?y c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0?y}
e: well_formed_closed phi^{evar:0fresh} → eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}
well_formed_closed_ex_aux psi 0
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi
H: x ∈ eval (update_evar_val ?y c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0?y}
e: well_formed_closed phi^{evar:0fresh} → eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}
evar_is_fresh_in fresh phi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi
H: x ∈ eval (update_evar_val ?y c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0?y}
e: well_formed_closed phi^{evar:0fresh} → eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}
evar_is_fresh_in fresh phi^[[svar:X↦psi]]
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi
H: x ∈ eval (update_evar_val ?y c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0?y}
e:= IHsz phi^{evar:0fresh} psi X (update_evar_val fresh c ρ) ?Goal8 ?Goal9: well_formed_closed phi^{evar:0fresh} → eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval (update_evar_val fresh c ρ) psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}
e0:= eval_free_evar_independent ρ fresh c psi: evar_is_fresh_in fresh psi → eval (update_evar_val fresh c ρ) psi = eval ρ psi
evar_is_fresh_in fresh psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi
H: x ∈ eval (update_evar_val ?y c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0?y}
e: well_formed_closed phi^{evar:0fresh} → eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}

x ∈ eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi
H: x ∈ eval (update_evar_val ?y c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0?y}
e: well_formed_closed phi^{evar:0fresh} → eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}
well_formed_closed phi^{evar:0fresh}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi
H: x ∈ eval (update_evar_val ?y c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0?y}
e: well_formed_closed phi^{evar:0fresh} → eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}
well_formed_closed_ex_aux psi 0
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi
H: x ∈ eval (update_evar_val ?y c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0?y}
e: well_formed_closed phi^{evar:0fresh} → eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}

x ∈ eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}
exact H.
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi
H: x ∈ eval (update_evar_val fresh c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0fresh}
e: well_formed_closed phi^{evar:0fresh} → eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}

well_formed_closed phi^{evar:0fresh}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc1: well_formed_closed_mu_aux (ex , phi) 0 = true
Hwfc2: well_formed_closed_ex_aux (ex , phi) 0 = true
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi
H: x ∈ eval (update_evar_val fresh c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0fresh}
e: well_formed_closed phi^{evar:0fresh} → eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}

well_formed_closed phi^{evar:0fresh}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc1: well_formed_closed_mu_aux phi 0 = true
Hwfc2: well_formed_closed_ex_aux phi 1 = true
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi
H: x ∈ eval (update_evar_val fresh c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0fresh}
e: well_formed_closed phi^{evar:0fresh} → eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}

well_formed_closed phi^{evar:0fresh}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc1: well_formed_closed_mu_aux phi 0 = true
Hwfc2: well_formed_closed_ex_aux phi 1 = true
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi
H: x ∈ eval (update_evar_val fresh c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0fresh}
e: well_formed_closed phi^{evar:0fresh} → eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}

well_formed_closed_mu_aux phi^{evar:0fresh} 0 = true ∧ well_formed_closed_ex_aux phi^{evar:0fresh} 0 = true
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc1: well_formed_closed_mu_aux phi 0 = true
Hwfc2: well_formed_closed_ex_aux phi 1 = true
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi
H: x ∈ eval (update_evar_val fresh c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0fresh}
e: well_formed_closed phi^{evar:0fresh} → eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}

well_formed_closed_mu_aux phi^{evar:0fresh} 0 = true
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc1: well_formed_closed_mu_aux phi 0 = true
Hwfc2: well_formed_closed_ex_aux phi 1 = true
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi
H: x ∈ eval (update_evar_val fresh c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0fresh}
e: well_formed_closed phi^{evar:0fresh} → eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}
well_formed_closed_ex_aux phi^{evar:0fresh} 0 = true
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc1: well_formed_closed_mu_aux phi 0 = true
Hwfc2: well_formed_closed_ex_aux phi 1 = true
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi
H: x ∈ eval (update_evar_val fresh c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0fresh}
e: well_formed_closed phi^{evar:0fresh} → eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}

well_formed_closed_mu_aux phi^{evar:0fresh} 0 = true
now apply wfc_mu_aux_body_ex_imp1.
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc1: well_formed_closed_mu_aux phi 0 = true
Hwfc2: well_formed_closed_ex_aux phi 1 = true
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi
H: x ∈ eval (update_evar_val fresh c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0fresh}
e: well_formed_closed phi^{evar:0fresh} → eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}

well_formed_closed_ex_aux phi^{evar:0fresh} 0 = true
now apply wfc_ex_aux_body_ex_imp1.
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi
H: x ∈ eval (update_evar_val fresh c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0fresh}
e: well_formed_closed phi^{evar:0fresh} → eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}

well_formed_closed_ex_aux psi 0
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed_closed psi = true
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi
H: x ∈ eval (update_evar_val fresh c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0fresh}
e: well_formed_closed phi^{evar:0fresh} → eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}

well_formed_closed_ex_aux psi 0
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed_closed_ex_aux psi 0 = true
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi
H: x ∈ eval (update_evar_val fresh c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0fresh}
e: well_formed_closed phi^{evar:0fresh} → eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}

well_formed_closed_ex_aux psi 0
apply Hwf.
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz

eval ρ (ex , (fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) (ex , phi)
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz

(let x := fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi) in propset_fa_union (λ e : M, let ρ' := update_evar_val x e ρ in eval ρ' ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x0 => patt_free_evar x0 | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x0 => patt_bound_evar x0 | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0↦x})) = (let x := fresh_evar phi in propset_fa_union (λ e : M, let ρ' := update_evar_val x e (update_svar_val X (eval ρ psi) ρ) in eval ρ' phi^{evar:0↦x}))
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz

propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) e ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0↦fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)}) = propset_fa_union (λ e : M, eval (update_evar_val (fresh_evar phi) e (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi})
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz

c : M, eval (update_evar_val (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0↦fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)} = eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c: M

eval (update_evar_val (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0↦fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)} = eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c: M

eval (update_evar_val (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0↦fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)} ⊆ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi} ⊆ eval (update_evar_val (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0↦fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c: M

( x : M, x ∈ eval (update_evar_val (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x0 => patt_free_evar x0 | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x0 => patt_bound_evar x0 | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x0 => patt_free_evar x0 | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x0 => patt_bound_evar x0 | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0↦fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x0 => patt_free_evar x0 | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x0 => patt_bound_evar x0 | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)} → x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}) ∧ ( x : M, x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi} → x ∈ eval (update_evar_val (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x0 => patt_free_evar x0 | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x0 => patt_bound_evar x0 | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x0 => patt_free_evar x0 | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x0 => patt_bound_evar x0 | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0↦fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x0 => patt_free_evar x0 | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x0 => patt_bound_evar x0 | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)})
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c: M

x : M, x ∈ eval (update_evar_val (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x0 => patt_free_evar x0 | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x0 => patt_bound_evar x0 | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x0 => patt_free_evar x0 | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x0 => patt_bound_evar x0 | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0↦fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x0 => patt_free_evar x0 | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x0 => patt_bound_evar x0 | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)} → x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c: M
x : M, x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi} → x ∈ eval (update_evar_val (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x0 => patt_free_evar x0 | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x0 => patt_bound_evar x0 | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x0 => patt_free_evar x0 | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x0 => patt_bound_evar x0 | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0↦ fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x0 => patt_free_evar x0 | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x0 => patt_bound_evar x0 | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c: M

x : M, x ∈ eval (update_evar_val (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x0 => patt_free_evar x0 | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x0 => patt_bound_evar x0 | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x0 => patt_free_evar x0 | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x0 => patt_bound_evar x0 | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0↦fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x0 => patt_free_evar x0 | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x0 => patt_bound_evar x0 | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)} → x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H1: x ∈ eval (update_evar_val (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0↦ fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)}

x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H1: x ∈ eval (update_evar_val (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0↦ fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)}
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi

x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H1: x ∈ eval (update_evar_val (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0↦ fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)}
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)

x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H1: x ∈ eval (update_evar_val (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0↦ fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)}
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)

evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H1: x ∈ eval (update_evar_val (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0↦ fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)}
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H1: x ∈ eval (update_evar_val (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0↦ fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)}
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)

evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
apply set_evar_fresh_is_fresh.
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H1: x ∈ eval (update_evar_val (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0↦ fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)}
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]

x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H1: x ∈ eval (update_evar_val (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0↦ fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)}
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]

fresh ∉ B
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H1: x ∈ eval (update_evar_val (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0↦ fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)}
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
H3: fresh ∉ B
x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H1: x ∈ eval (update_evar_val (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0↦ fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)}
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]

fresh ∉ B
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: S (size phi) ≤ sz
c, x: M
H1: x ∈ eval (update_evar_val (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0↦ fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]

evar_fresh (elements (free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi)) ∉ free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
apply set_evar_fresh_is_fresh'.
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H1: x ∈ eval (update_evar_val (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0↦ fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)}
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
H3: fresh ∉ B

x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H1: x ∈ eval (update_evar_val (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0↦ fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)}
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
H3: evar_fresh (elements B) ∉ B

x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H1: x ∈ eval (update_evar_val (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0↦ fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
H3: evar_fresh (elements (free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi)) ∉ free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi

x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H1: x ∈ eval (update_evar_val (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0↦ fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
H3: (evar_fresh (elements (free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi)) ∉ free_evars phi^[[svar:X↦psi]] ∪ free_evars phi) ∧ evar_fresh (elements (free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi)) ∉ free_evars psi

x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H1: x ∈ eval (update_evar_val (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0↦ fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
H3: evar_fresh (elements (free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi)) ∉ free_evars phi^[[svar:X↦psi]] ∪ free_evars phi
H4: evar_fresh (elements (free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi)) ∉ free_evars psi

x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H1: x ∈ eval (update_evar_val (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0↦ fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
H3: (evar_fresh (elements (free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi)) ∉ free_evars phi^[[svar:X↦psi]]) ∧ evar_fresh (elements (free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi)) ∉ free_evars phi
H4: evar_fresh (elements (free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi)) ∉ free_evars psi

x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H1: x ∈ eval (update_evar_val (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0↦ fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
H3: evar_fresh (elements (free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi)) ∉ free_evars phi^[[svar:X↦psi]]
H5: evar_fresh (elements (free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi)) ∉ free_evars phi
H4: evar_fresh (elements (free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi)) ∉ free_evars psi

x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H1: x ∈ eval (update_evar_val (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0↦ fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
H3: evar_fresh (elements B) ∉ free_evars phi^[[svar:X↦psi]]
H5: evar_fresh (elements B) ∉ free_evars phi
H4: evar_fresh (elements B) ∉ free_evars psi

x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H1: x ∈ eval (update_evar_val (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0↦ fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi

x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H1: x ∈ eval (update_evar_val (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0↦ fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi

evar_is_fresh_in fresh phi^[[svar:X↦psi]]
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H1: x ∈ eval (update_evar_val (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0↦ fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H1: x ∈ eval (update_evar_val (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0↦ fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi

evar_is_fresh_in fresh phi^[[svar:X↦psi]]
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H1: x ∈ eval (update_evar_val (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0↦ fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi

fresh ∉ free_evars phi^[[svar:X↦psi]]
assumption.
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H1: x ∈ eval (update_evar_val (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0↦ fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]

x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H1: x ∈ eval (update_evar_val (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0↦ fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
HFresh: eval (update_evar_val (fresh_evar phi^[[svar:X↦psi]]) c ρ) phi^[[svar:X↦psi]]^{evar:0↦ fresh_evar phi^[[svar:X↦psi]]} = eval (update_evar_val fresh c ρ) phi^[[svar:X↦psi]]^{evar:0fresh}

x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H1: x ∈ eval (update_evar_val (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0↦ fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
HFresh: eval (update_evar_val (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0↦ fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)} = eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0fresh}

x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
fresh: evar
H1: x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0fresh}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
HFresh: eval (update_evar_val (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0↦ fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)} = eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0fresh}

x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
fresh: evar
H1: x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0fresh}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]

x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
fresh: evar
H1: x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0fresh}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]

evar_is_fresh_in fresh phi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
fresh: evar
H1: x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0fresh}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
fresh: evar
H1: x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0fresh}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]

evar_is_fresh_in fresh phi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
fresh: evar
H1: x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0fresh}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]

fresh ∉ free_evars phi
assumption.
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
fresh: evar
H1: x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0fresh}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi

x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
fresh: evar
H1: x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0fresh}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi

evar_is_fresh_in (fresh_evar phi) phi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
fresh: evar
H1: x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0fresh}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
fresh: evar
H1: x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0fresh}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi

evar_is_fresh_in (fresh_evar phi) phi
apply set_evar_fresh_is_fresh.
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
fresh: evar
H1: x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0fresh}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi

x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
fresh: evar
H1: x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0fresh}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
HFresh:= eval_fresh_evar_open ?x ?y c 0 (update_svar_val X (eval ρ psi) ρ) ?Goal10 ?Goal11: eval (update_evar_val ?x c (update_svar_val X (eval ρ psi) ρ)) ^{evar:0?x} = eval (update_evar_val ?y c (update_svar_val X (eval ρ psi) ρ)) ^{evar:0?y}

x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
fresh: evar
H1: x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0fresh}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
HFresh:= eval_fresh_evar_open phi (fresh_evar phi) ?y c 0 (update_svar_val X (eval ρ psi) ρ) ?Goal10 ?Goal11: eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi} = eval (update_evar_val ?y c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0?y}

x ∈ eval (update_evar_val ?y c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0?y}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
fresh: evar
H1: x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0fresh}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi

x ∈ eval (update_evar_val ?y c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0?y}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
fresh: evar
H1: x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0fresh}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
e:= IHsz phi^{evar:0fresh} psi X (update_evar_val fresh c ρ) ?Goal12 ?Goal13: well_formed_closed phi^{evar:0fresh} → eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval (update_evar_val fresh c ρ) psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}

x ∈ eval (update_evar_val ?y c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0?y}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
fresh: evar
H1: x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0fresh}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
e:= IHsz phi^{evar:0fresh} psi X (update_evar_val fresh c ρ) ?Goal12 ?Goal13: well_formed_closed phi^{evar:0fresh} → eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval (update_evar_val fresh c ρ) psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}
e0:= eval_free_evar_independent ρ fresh c psi: evar_is_fresh_in fresh psi → eval (update_evar_val fresh c ρ) psi = eval ρ psi

x ∈ eval (update_evar_val ?y c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0?y}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
fresh: evar
H1: x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0fresh}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
e: well_formed_closed phi^{evar:0fresh} → eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}
e0:= eval_free_evar_independent ρ fresh c psi: evar_is_fresh_in fresh psi → eval (update_evar_val fresh c ρ) psi = eval ρ psi

x ∈ eval (update_evar_val ?y c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0?y}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
fresh: evar
H1: x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0fresh}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
e:= IHsz phi^{evar:0fresh} psi X (update_evar_val fresh c ρ) ?Goal12 ?Goal13: well_formed_closed phi^{evar:0fresh} → eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval (update_evar_val fresh c ρ) psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}
e0:= eval_free_evar_independent ρ fresh c psi: evar_is_fresh_in fresh psi → eval (update_evar_val fresh c ρ) psi = eval ρ psi
evar_is_fresh_in fresh psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
fresh: evar
H1: x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0fresh}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
e: well_formed_closed phi^{evar:0fresh} → eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}

x ∈ eval (update_evar_val ?y c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0?y}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
fresh: evar
H1: x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0fresh}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
e:= IHsz phi^{evar:0fresh} psi X (update_evar_val fresh c ρ) ?Goal12 ?Goal13: well_formed_closed phi^{evar:0fresh} → eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval (update_evar_val fresh c ρ) psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}
e0:= eval_free_evar_independent ρ fresh c psi: evar_is_fresh_in fresh psi → eval (update_evar_val fresh c ρ) psi = eval ρ psi
evar_is_fresh_in fresh psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
fresh: evar
H1: x ∈ eval (update_evar_val fresh c ρ) phi^[[svar:X↦psi]]^{evar:0fresh}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
e: well_formed_closed phi^{evar:0fresh} → eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}

x ∈ eval (update_evar_val ?y c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0?y}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
fresh: evar
H1: x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0fresh}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
e:= IHsz phi^{evar:0fresh} psi X (update_evar_val fresh c ρ) ?Goal12 ?Goal13: well_formed_closed phi^{evar:0fresh} → eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval (update_evar_val fresh c ρ) psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}
e0:= eval_free_evar_independent ρ fresh c psi: evar_is_fresh_in fresh psi → eval (update_evar_val fresh c ρ) psi = eval ρ psi
evar_is_fresh_in fresh psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
fresh: evar
H1: x ∈ eval (update_evar_val fresh c ρ) phi^{evar:0fresh}^[[svar:X↦psi]]
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
e: well_formed_closed phi^{evar:0fresh} → eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}

x ∈ eval (update_evar_val ?y c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0?y}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
fresh: evar
H1: x ∈ eval (update_evar_val fresh c ρ) phi^[[svar:X↦psi]]^{evar:0fresh}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
e: well_formed_closed phi^{evar:0fresh} → eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}
well_formed_closed_ex_aux psi 0
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
fresh: evar
H1: x ∈ eval (update_evar_val fresh c ρ) phi^[[svar:X↦psi]]^{evar:0fresh}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
e: well_formed_closed phi^{evar:0fresh} → eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}
evar_is_fresh_in fresh phi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
fresh: evar
H1: x ∈ eval (update_evar_val fresh c ρ) phi^[[svar:X↦psi]]^{evar:0fresh}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
e: well_formed_closed phi^{evar:0fresh} → eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}
evar_is_fresh_in fresh phi^[[svar:X↦psi]]
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
fresh: evar
H1: x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0fresh}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
e:= IHsz phi^{evar:0fresh} psi X (update_evar_val fresh c ρ) ?Goal12 ?Goal13: well_formed_closed phi^{evar:0fresh} → eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval (update_evar_val fresh c ρ) psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}
e0:= eval_free_evar_independent ρ fresh c psi: evar_is_fresh_in fresh psi → eval (update_evar_val fresh c ρ) psi = eval ρ psi
evar_is_fresh_in fresh psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
fresh: evar
H1: x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh})
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
e: well_formed_closed phi^{evar:0fresh} → eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}

x ∈ eval (update_evar_val ?y c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0?y}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
fresh: evar
H1: x ∈ eval (update_evar_val fresh c ρ) phi^[[svar:X↦psi]]^{evar:0fresh}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
e: well_formed_closed phi^{evar:0fresh} → eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}
well_formed_closed_ex_aux psi 0
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
fresh: evar
H1: x ∈ eval (update_evar_val fresh c ρ) phi^[[svar:X↦psi]]^{evar:0fresh}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
e: well_formed_closed phi^{evar:0fresh} → eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}
evar_is_fresh_in fresh phi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
fresh: evar
H1: x ∈ eval (update_evar_val fresh c ρ) phi^[[svar:X↦psi]]^{evar:0fresh}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
e: well_formed_closed phi^{evar:0fresh} → eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}
evar_is_fresh_in fresh phi^[[svar:X↦psi]]
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
fresh: evar
H1: x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0fresh}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
e:= IHsz phi^{evar:0fresh} psi X (update_evar_val fresh c ρ) ?Goal12 ?Goal13: well_formed_closed phi^{evar:0fresh} → eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval (update_evar_val fresh c ρ) psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}
e0:= eval_free_evar_independent ρ fresh c psi: evar_is_fresh_in fresh psi → eval (update_evar_val fresh c ρ) psi = eval ρ psi
evar_is_fresh_in fresh psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
fresh: evar
H1: x ∈ eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
e: well_formed_closed phi^{evar:0fresh} → eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}

x ∈ eval (update_evar_val ?y c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0?y}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
fresh: evar
H1: x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh})
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
e: well_formed_closed phi^{evar:0fresh} → eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}
well_formed_closed phi^{evar:0fresh}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
fresh: evar
H1: x ∈ eval (update_evar_val fresh c ρ) phi^[[svar:X↦psi]]^{evar:0fresh}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
e: well_formed_closed phi^{evar:0fresh} → eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}
well_formed_closed_ex_aux psi 0
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
fresh: evar
H1: x ∈ eval (update_evar_val fresh c ρ) phi^[[svar:X↦psi]]^{evar:0fresh}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
e: well_formed_closed phi^{evar:0fresh} → eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}
evar_is_fresh_in fresh phi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
fresh: evar
H1: x ∈ eval (update_evar_val fresh c ρ) phi^[[svar:X↦psi]]^{evar:0fresh}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
e: well_formed_closed phi^{evar:0fresh} → eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}
evar_is_fresh_in fresh phi^[[svar:X↦psi]]
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
fresh: evar
H1: x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0fresh}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
e:= IHsz phi^{evar:0fresh} psi X (update_evar_val fresh c ρ) ?Goal12 ?Goal13: well_formed_closed phi^{evar:0fresh} → eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval (update_evar_val fresh c ρ) psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}
e0:= eval_free_evar_independent ρ fresh c psi: evar_is_fresh_in fresh psi → eval (update_evar_val fresh c ρ) psi = eval ρ psi
evar_is_fresh_in fresh psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
fresh: evar
H1: x ∈ eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
e: well_formed_closed phi^{evar:0fresh} → eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}

x ∈ eval (update_evar_val ?y c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0?y}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
fresh: evar
H1: x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh})
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
e: well_formed_closed phi^{evar:0fresh} → eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}
well_formed_closed phi^{evar:0fresh}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
fresh: evar
H1: x ∈ eval (update_evar_val fresh c ρ) phi^[[svar:X↦psi]]^{evar:0fresh}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
e: well_formed_closed phi^{evar:0fresh} → eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}
well_formed_closed_ex_aux psi 0
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
fresh: evar
H1: x ∈ eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
e: well_formed_closed phi^{evar:0fresh} → eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}

x ∈ eval (update_evar_val ?y c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0?y}
exact H1.
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
fresh: evar
H1: x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh})
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
e: well_formed_closed phi^{evar:0fresh} → eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}

well_formed_closed phi^{evar:0fresh}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc1: well_formed_closed_mu_aux (ex , phi) 0 = true
Hwfc2: well_formed_closed_ex_aux (ex , phi) 0 = true
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
fresh: evar
H1: x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh})
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
e: well_formed_closed phi^{evar:0fresh} → eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}

well_formed_closed phi^{evar:0fresh}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc1: well_formed_closed_mu_aux phi 0 = true
Hwfc2: well_formed_closed_ex_aux phi 1 = true
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
fresh: evar
H1: x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh})
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
e: well_formed_closed phi^{evar:0fresh} → eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}

well_formed_closed phi^{evar:0fresh}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc1: well_formed_closed_mu_aux phi 0 = true
Hwfc2: well_formed_closed_ex_aux phi 1 = true
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
fresh: evar
H1: x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh})
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
e: well_formed_closed phi^{evar:0fresh} → eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}

well_formed_closed_mu_aux phi^{evar:0fresh} 0 = true ∧ well_formed_closed_ex_aux phi^{evar:0fresh} 0 = true
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc1: well_formed_closed_mu_aux phi 0 = true
Hwfc2: well_formed_closed_ex_aux phi 1 = true
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
fresh: evar
H1: x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh})
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
e: well_formed_closed phi^{evar:0fresh} → eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}

well_formed_closed_mu_aux phi^{evar:0fresh} 0 = true
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc1: well_formed_closed_mu_aux phi 0 = true
Hwfc2: well_formed_closed_ex_aux phi 1 = true
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
fresh: evar
H1: x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh})
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
e: well_formed_closed phi^{evar:0fresh} → eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}
well_formed_closed_ex_aux phi^{evar:0fresh} 0 = true
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc1: well_formed_closed_mu_aux phi 0 = true
Hwfc2: well_formed_closed_ex_aux phi 1 = true
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
fresh: evar
H1: x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh})
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
e: well_formed_closed phi^{evar:0fresh} → eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}

well_formed_closed_mu_aux phi^{evar:0fresh} 0 = true
now apply wfc_mu_aux_body_ex_imp1.
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc1: well_formed_closed_mu_aux phi 0 = true
Hwfc2: well_formed_closed_ex_aux phi 1 = true
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
fresh: evar
H1: x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh})
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
e: well_formed_closed phi^{evar:0fresh} → eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}

well_formed_closed_ex_aux phi^{evar:0fresh} 0 = true
now apply wfc_ex_aux_body_ex_imp1.
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
fresh: evar
H1: x ∈ eval (update_evar_val fresh c ρ) phi^[[svar:X↦psi]]^{evar:0fresh}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
e: well_formed_closed phi^{evar:0fresh} → eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}

well_formed_closed_ex_aux psi 0
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed_closed psi = true
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
fresh: evar
H1: x ∈ eval (update_evar_val fresh c ρ) phi^[[svar:X↦psi]]^{evar:0fresh}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
e: well_formed_closed phi^{evar:0fresh} → eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}

well_formed_closed_ex_aux psi 0
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed_closed_ex_aux psi 0 = true
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
fresh: evar
H1: x ∈ eval (update_evar_val fresh c ρ) phi^[[svar:X↦psi]]^{evar:0fresh}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
e: well_formed_closed phi^{evar:0fresh} → eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}

well_formed_closed_ex_aux psi 0
apply Hwf.
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c: M

x : M, x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi} → x ∈ eval (update_evar_val (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x0 => patt_free_evar x0 | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x0 => patt_bound_evar x0 | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x0 => patt_free_evar x0 | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x0 => patt_bound_evar x0 | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0↦fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x0 => patt_free_evar x0 | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x0 => patt_bound_evar x0 | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H1: x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}

x ∈ eval (update_evar_val (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0↦fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H1: x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi

x ∈ eval (update_evar_val (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0↦fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H1: x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)

x ∈ eval (update_evar_val (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0↦fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H1: x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)

evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H1: x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
x ∈ eval (update_evar_val (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0↦ fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H1: x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)

evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
apply set_evar_fresh_is_fresh.
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H1: x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]

x ∈ eval (update_evar_val (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0↦fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H1: x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]

fresh ∉ B
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H1: x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
H3: fresh ∉ B
x ∈ eval (update_evar_val (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0↦ fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H1: x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]

fresh ∉ B
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: S (size phi) ≤ sz
c, x: M
H1: x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]

evar_fresh (elements (free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi)) ∉ free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
apply set_evar_fresh_is_fresh'.
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H1: x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
H3: fresh ∉ B

x ∈ eval (update_evar_val (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0↦fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H1: x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
H3: evar_fresh (elements B) ∉ B

x ∈ eval (update_evar_val (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0↦fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H1: x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
H3: evar_fresh (elements (free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi)) ∉ free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi

x ∈ eval (update_evar_val (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0↦fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H1: x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
H3: (evar_fresh (elements (free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi)) ∉ free_evars phi^[[svar:X↦psi]] ∪ free_evars phi) ∧ evar_fresh (elements (free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi)) ∉ free_evars psi

x ∈ eval (update_evar_val (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0↦fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H1: x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
H3: evar_fresh (elements (free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi)) ∉ free_evars phi^[[svar:X↦psi]] ∪ free_evars phi
H4: evar_fresh (elements (free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi)) ∉ free_evars psi

x ∈ eval (update_evar_val (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0↦fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H1: x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
H3: (evar_fresh (elements (free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi)) ∉ free_evars phi^[[svar:X↦psi]]) ∧ evar_fresh (elements (free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi)) ∉ free_evars phi
H4: evar_fresh (elements (free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi)) ∉ free_evars psi

x ∈ eval (update_evar_val (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0↦fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H1: x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
H3: evar_fresh (elements (free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi)) ∉ free_evars phi^[[svar:X↦psi]]
H5: evar_fresh (elements (free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi)) ∉ free_evars phi
H4: evar_fresh (elements (free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi)) ∉ free_evars psi

x ∈ eval (update_evar_val (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0↦fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H1: x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
H3: evar_fresh (elements B) ∉ free_evars phi^[[svar:X↦psi]]
H5: evar_fresh (elements B) ∉ free_evars phi
H4: evar_fresh (elements B) ∉ free_evars psi

x ∈ eval (update_evar_val (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0↦fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H1: x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi

x ∈ eval (update_evar_val (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0↦fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H1: x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi

evar_is_fresh_in fresh phi^[[svar:X↦psi]]
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H1: x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
x ∈ eval (update_evar_val (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0↦ fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H1: x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi

evar_is_fresh_in fresh phi^[[svar:X↦psi]]
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H1: x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi

fresh ∉ free_evars phi^[[svar:X↦psi]]
assumption.
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H1: x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]

x ∈ eval (update_evar_val (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0↦fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H1: x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
HFresh:= eval_fresh_evar_open phi^[[svar:X↦psi]] (fresh_evar phi^[[svar:X↦psi]]) fresh c 0 ρ H2 H3: eval (update_evar_val (fresh_evar phi^[[svar:X↦psi]]) c ρ) phi^[[svar:X↦psi]]^{evar:0↦ fresh_evar phi^[[svar:X↦psi]]} = eval (update_evar_val fresh c ρ) phi^[[svar:X↦psi]]^{evar:0fresh}

x ∈ eval (update_evar_val (fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0↦fresh_evar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H1: x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
HFresh:= eval_fresh_evar_open phi^[[svar:X↦psi]] (fresh_evar phi^[[svar:X↦psi]]) fresh c 0 ρ H2 H3: eval (update_evar_val (fresh_evar phi^[[svar:X↦psi]]) c ρ) phi^[[svar:X↦psi]]^{evar:0↦ fresh_evar phi^[[svar:X↦psi]]} = eval (update_evar_val fresh c ρ) phi^[[svar:X↦psi]]^{evar:0fresh}

x ∈ eval (update_evar_val (fresh_evar phi^[[svar:X↦psi]]) c ρ) phi^[[svar:X↦psi]]^{evar:0↦fresh_evar phi^[[svar:X↦psi]]}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H1: x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
HFresh:= eval_fresh_evar_open phi^[[svar:X↦psi]] (fresh_evar phi^[[svar:X↦psi]]) fresh c 0 ρ H2 H3: eval (update_evar_val (fresh_evar phi^[[svar:X↦psi]]) c ρ) phi^[[svar:X↦psi]]^{evar:0↦ fresh_evar phi^[[svar:X↦psi]]} = eval (update_evar_val fresh c ρ) phi^[[svar:X↦psi]]^{evar:0fresh}

x ∈ eval (update_evar_val fresh c ρ) phi^[[svar:X↦psi]]^{evar:0fresh}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H1: x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]

x ∈ eval (update_evar_val fresh c ρ) phi^[[svar:X↦psi]]^{evar:0fresh}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H1: x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]

evar_is_fresh_in fresh phi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H1: x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
x ∈ eval (update_evar_val fresh c ρ) phi^[[svar:X↦psi]]^{evar:0fresh}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H1: x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]

evar_is_fresh_in fresh phi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H1: x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]

fresh ∉ free_evars phi
assumption.
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H1: x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi

x ∈ eval (update_evar_val fresh c ρ) phi^[[svar:X↦psi]]^{evar:0fresh}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H1: x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi

evar_is_fresh_in (fresh_evar phi) phi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H1: x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
x ∈ eval (update_evar_val fresh c ρ) phi^[[svar:X↦psi]]^{evar:0fresh}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H1: x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi

evar_is_fresh_in (fresh_evar phi) phi
apply set_evar_fresh_is_fresh.
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H1: x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi

x ∈ eval (update_evar_val fresh c ρ) phi^[[svar:X↦psi]]^{evar:0fresh}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H1: x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
HFresh: eval (update_evar_val ?x c (update_svar_val X (eval ρ psi) ρ)) ^{evar:0?x} = eval (update_evar_val ?y c (update_svar_val X (eval ρ psi) ρ)) ^{evar:0?y}

x ∈ eval (update_evar_val fresh c ρ) phi^[[svar:X↦psi]]^{evar:0fresh}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
H1: x ∈ eval (update_evar_val ?y c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0?y}
HFresh: eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi} = eval (update_evar_val ?y c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0?y}

x ∈ eval (update_evar_val fresh c ρ) phi^[[svar:X↦psi]]^{evar:0fresh}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
H1: x ∈ eval (update_evar_val ?y c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0?y}

x ∈ eval (update_evar_val fresh c ρ) phi^[[svar:X↦psi]]^{evar:0fresh}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
H1: x ∈ eval (update_evar_val ?y c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0?y}
e:= IHsz phi^{evar:0fresh} psi X (update_evar_val fresh c ρ) ?Goal15 ?Goal16: well_formed_closed phi^{evar:0fresh} → eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval (update_evar_val fresh c ρ) psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}

x ∈ eval (update_evar_val fresh c ρ) phi^[[svar:X↦psi]]^{evar:0fresh}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
H1: x ∈ eval (update_evar_val ?y c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0?y}
e:= IHsz phi^{evar:0fresh} psi X (update_evar_val fresh c ρ) ?Goal15 ?Goal16: well_formed_closed phi^{evar:0fresh} → eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval (update_evar_val fresh c ρ) psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}
e0:= eval_free_evar_independent ρ fresh c psi: evar_is_fresh_in fresh psi → eval (update_evar_val fresh c ρ) psi = eval ρ psi

x ∈ eval (update_evar_val fresh c ρ) phi^[[svar:X↦psi]]^{evar:0fresh}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
H1: x ∈ eval (update_evar_val ?y c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0?y}
e: well_formed_closed phi^{evar:0fresh} → eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}
e0:= eval_free_evar_independent ρ fresh c psi: evar_is_fresh_in fresh psi → eval (update_evar_val fresh c ρ) psi = eval ρ psi

x ∈ eval (update_evar_val fresh c ρ) phi^[[svar:X↦psi]]^{evar:0fresh}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
H1: x ∈ eval (update_evar_val ?y c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0?y}
e:= IHsz phi^{evar:0fresh} psi X (update_evar_val fresh c ρ) ?Goal15 ?Goal16: well_formed_closed phi^{evar:0fresh} → eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval (update_evar_val fresh c ρ) psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}
e0:= eval_free_evar_independent ρ fresh c psi: evar_is_fresh_in fresh psi → eval (update_evar_val fresh c ρ) psi = eval ρ psi
evar_is_fresh_in fresh psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
H1: x ∈ eval (update_evar_val ?y c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0?y}
e: well_formed_closed phi^{evar:0fresh} → eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}

x ∈ eval (update_evar_val fresh c ρ) phi^[[svar:X↦psi]]^{evar:0fresh}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
H1: x ∈ eval (update_evar_val ?y c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0?y}
e:= IHsz phi^{evar:0fresh} psi X (update_evar_val fresh c ρ) ?Goal15 ?Goal16: well_formed_closed phi^{evar:0fresh} → eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval (update_evar_val fresh c ρ) psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}
e0:= eval_free_evar_independent ρ fresh c psi: evar_is_fresh_in fresh psi → eval (update_evar_val fresh c ρ) psi = eval ρ psi
evar_is_fresh_in fresh psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
H1: x ∈ eval (update_evar_val ?y c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0?y}
e: well_formed_closed phi^{evar:0fresh} → eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}

x ∈ eval (update_evar_val fresh c ρ) phi^{evar:0fresh}^[[svar:X↦psi]]
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
H1: x ∈ eval (update_evar_val ?y c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0?y}
e: well_formed_closed phi^{evar:0fresh} → eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}
well_formed_closed_ex_aux psi 0
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
H1: x ∈ eval (update_evar_val ?y c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0?y}
e: well_formed_closed phi^{evar:0fresh} → eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}
evar_is_fresh_in fresh phi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
H1: x ∈ eval (update_evar_val ?y c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0?y}
e: well_formed_closed phi^{evar:0fresh} → eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}
evar_is_fresh_in fresh phi^[[svar:X↦psi]]
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
H1: x ∈ eval (update_evar_val ?y c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0?y}
e:= IHsz phi^{evar:0fresh} psi X (update_evar_val fresh c ρ) ?Goal15 ?Goal16: well_formed_closed phi^{evar:0fresh} → eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval (update_evar_val fresh c ρ) psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}
e0:= eval_free_evar_independent ρ fresh c psi: evar_is_fresh_in fresh psi → eval (update_evar_val fresh c ρ) psi = eval ρ psi
evar_is_fresh_in fresh psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
H1: x ∈ eval (update_evar_val ?y c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0?y}
e: well_formed_closed phi^{evar:0fresh} → eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}

x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh})
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
H1: x ∈ eval (update_evar_val ?y c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0?y}
e: well_formed_closed phi^{evar:0fresh} → eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}
well_formed_closed_ex_aux psi 0
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
H1: x ∈ eval (update_evar_val ?y c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0?y}
e: well_formed_closed phi^{evar:0fresh} → eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}
evar_is_fresh_in fresh phi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
H1: x ∈ eval (update_evar_val ?y c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0?y}
e: well_formed_closed phi^{evar:0fresh} → eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}
evar_is_fresh_in fresh phi^[[svar:X↦psi]]
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
H1: x ∈ eval (update_evar_val ?y c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0?y}
e:= IHsz phi^{evar:0fresh} psi X (update_evar_val fresh c ρ) ?Goal15 ?Goal16: well_formed_closed phi^{evar:0fresh} → eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval (update_evar_val fresh c ρ) psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}
e0:= eval_free_evar_independent ρ fresh c psi: evar_is_fresh_in fresh psi → eval (update_evar_val fresh c ρ) psi = eval ρ psi
evar_is_fresh_in fresh psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
H1: x ∈ eval (update_evar_val ?y c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0?y}
e: well_formed_closed phi^{evar:0fresh} → eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}

x ∈ eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
H1: x ∈ eval (update_evar_val ?y c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0?y}
e: well_formed_closed phi^{evar:0fresh} → eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}
well_formed_closed phi^{evar:0fresh}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
H1: x ∈ eval (update_evar_val ?y c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0?y}
e: well_formed_closed phi^{evar:0fresh} → eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}
well_formed_closed_ex_aux psi 0
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
H1: x ∈ eval (update_evar_val ?y c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0?y}
e: well_formed_closed phi^{evar:0fresh} → eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}
evar_is_fresh_in fresh phi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
H1: x ∈ eval (update_evar_val ?y c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0?y}
e: well_formed_closed phi^{evar:0fresh} → eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}
evar_is_fresh_in fresh phi^[[svar:X↦psi]]
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
H1: x ∈ eval (update_evar_val ?y c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0?y}
e:= IHsz phi^{evar:0fresh} psi X (update_evar_val fresh c ρ) ?Goal15 ?Goal16: well_formed_closed phi^{evar:0fresh} → eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval (update_evar_val fresh c ρ) psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}
e0:= eval_free_evar_independent ρ fresh c psi: evar_is_fresh_in fresh psi → eval (update_evar_val fresh c ρ) psi = eval ρ psi
evar_is_fresh_in fresh psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
H1: x ∈ eval (update_evar_val ?y c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0?y}
e: well_formed_closed phi^{evar:0fresh} → eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}

x ∈ eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
H1: x ∈ eval (update_evar_val ?y c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0?y}
e: well_formed_closed phi^{evar:0fresh} → eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}
well_formed_closed phi^{evar:0fresh}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
H1: x ∈ eval (update_evar_val ?y c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0?y}
e: well_formed_closed phi^{evar:0fresh} → eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}
well_formed_closed_ex_aux psi 0
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
H1: x ∈ eval (update_evar_val ?y c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0?y}
e: well_formed_closed phi^{evar:0fresh} → eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}

x ∈ eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}
exact H1.
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
H1: x ∈ eval (update_evar_val fresh c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0fresh}
e: well_formed_closed phi^{evar:0fresh} → eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}

well_formed_closed phi^{evar:0fresh}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc1: well_formed_closed_mu_aux (ex , phi) 0 = true
Hwfc2: well_formed_closed_ex_aux (ex , phi) 0 = true
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
H1: x ∈ eval (update_evar_val fresh c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0fresh}
e: well_formed_closed phi^{evar:0fresh} → eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}

well_formed_closed phi^{evar:0fresh}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc1: well_formed_closed_mu_aux phi 0 = true
Hwfc2: well_formed_closed_ex_aux phi 1 = true
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
H1: x ∈ eval (update_evar_val fresh c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0fresh}
e: well_formed_closed phi^{evar:0fresh} → eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}

well_formed_closed phi^{evar:0fresh}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc1: well_formed_closed_mu_aux phi 0 = true
Hwfc2: well_formed_closed_ex_aux phi 1 = true
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
H1: x ∈ eval (update_evar_val fresh c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0fresh}
e: well_formed_closed phi^{evar:0fresh} → eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}

well_formed_closed_mu_aux phi^{evar:0fresh} 0 = true ∧ well_formed_closed_ex_aux phi^{evar:0fresh} 0 = true
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc1: well_formed_closed_mu_aux phi 0 = true
Hwfc2: well_formed_closed_ex_aux phi 1 = true
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
H1: x ∈ eval (update_evar_val fresh c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0fresh}
e: well_formed_closed phi^{evar:0fresh} → eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}

well_formed_closed_mu_aux phi^{evar:0fresh} 0 = true
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc1: well_formed_closed_mu_aux phi 0 = true
Hwfc2: well_formed_closed_ex_aux phi 1 = true
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
H1: x ∈ eval (update_evar_val fresh c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0fresh}
e: well_formed_closed phi^{evar:0fresh} → eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}
well_formed_closed_ex_aux phi^{evar:0fresh} 0 = true
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc1: well_formed_closed_mu_aux phi 0 = true
Hwfc2: well_formed_closed_ex_aux phi 1 = true
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
H1: x ∈ eval (update_evar_val fresh c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0fresh}
e: well_formed_closed phi^{evar:0fresh} → eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}

well_formed_closed_mu_aux phi^{evar:0fresh} 0 = true
now apply wfc_mu_aux_body_ex_imp1.
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc1: well_formed_closed_mu_aux phi 0 = true
Hwfc2: well_formed_closed_ex_aux phi 1 = true
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
H1: x ∈ eval (update_evar_val fresh c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0fresh}
e: well_formed_closed phi^{evar:0fresh} → eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}

well_formed_closed_ex_aux phi^{evar:0fresh} 0 = true
now apply wfc_ex_aux_body_ex_imp1.
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
H1: x ∈ eval (update_evar_val fresh c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0fresh}
e: well_formed_closed phi^{evar:0fresh} → eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}

well_formed_closed_ex_aux psi 0
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed_closed psi = true
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
H1: x ∈ eval (update_evar_val fresh c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0fresh}
e: well_formed_closed phi^{evar:0fresh} → eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}

well_formed_closed_ex_aux psi 0
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed_closed_ex_aux psi 0 = true
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
H1: x ∈ eval (update_evar_val fresh c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0fresh}
e: well_formed_closed phi^{evar:0fresh} → eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi^{evar:0fresh}) = eval (update_svar_val X (eval ρ psi) (update_evar_val fresh c ρ)) phi^{evar:0fresh}

well_formed_closed_ex_aux psi 0
apply Hwf.
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz

eval ρ (mu , (fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) (mu , phi)
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz

(let X0 := fresh_svar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi) in LeastFixpointOf (λ S : propset M, let ρ' := update_svar_val X0 S ρ in eval ρ' ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{svar:0↦X0})) = (let X0 := fresh_svar phi in LeastFixpointOf (λ S : propset M, let ρ' := update_svar_val X0 S (update_svar_val X (eval ρ psi) ρ) in eval ρ' phi^{svar:0↦X0}))
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz

LeastFixpointOf (λ S : propset M, eval (update_svar_val (fresh_svar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) S ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{svar:0↦fresh_svar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)}) = LeastFixpointOf (λ S : propset M, eval (update_svar_val (fresh_svar phi) S (update_svar_val X (eval ρ psi) ρ)) phi^{svar:0↦fresh_svar phi})
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz

LeastFixpointOf (λ S : propset M, eval (update_svar_val (fresh_svar phi^[[svar:X↦psi]]) S ρ) phi^[[svar:X↦psi]]^{svar:0↦fresh_svar phi^[[svar:X↦psi]]}) = LeastFixpointOf (λ S : propset M, eval (update_svar_val (fresh_svar phi) S (update_svar_val X (eval ρ psi) ρ)) phi^{svar:0↦fresh_svar phi})
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz

(λ S : propset M, eval (update_svar_val (fresh_svar phi^[[svar:X↦psi]]) S ρ) phi^[[svar:X↦psi]]^{svar:0↦fresh_svar phi^[[svar:X↦psi]]}) = (λ S : propset M, eval (update_svar_val (fresh_svar phi) S (update_svar_val X (eval ρ psi) ρ)) phi^{svar:0↦fresh_svar phi})
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
H: (λ S : propset M, eval (update_svar_val (fresh_svar phi^[[svar:X↦psi]]) S ρ) phi^[[svar:X↦psi]]^{svar:0↦ fresh_svar phi^[[svar:X↦psi]]}) = (λ S : propset M, eval (update_svar_val (fresh_svar phi) S (update_svar_val X (eval ρ psi) ρ)) phi^{svar:0↦fresh_svar phi})
LeastFixpointOf (λ S : propset M, eval (update_svar_val (fresh_svar phi^[[svar:X↦psi]]) S ρ) phi^[[svar:X↦psi]]^{svar:0↦ fresh_svar phi^[[svar:X↦psi]]}) = LeastFixpointOf (λ S : propset M, eval (update_svar_val (fresh_svar phi) S (update_svar_val X (eval ρ psi) ρ)) phi^{svar:0↦fresh_svar phi})
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz

x : propset M, eval (update_svar_val (fresh_svar phi^[[svar:X↦psi]]) x ρ) phi^[[svar:X↦psi]]^{svar:0↦fresh_svar phi^[[svar:X↦psi]]} = eval (update_svar_val (fresh_svar phi) x (update_svar_val X (eval ρ psi) ρ)) phi^{svar:0↦fresh_svar phi}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
H: (λ S : propset M, eval (update_svar_val (fresh_svar phi^[[svar:X↦psi]]) S ρ) phi^[[svar:X↦psi]]^{svar:0↦ fresh_svar phi^[[svar:X↦psi]]}) = (λ S : propset M, eval (update_svar_val (fresh_svar phi) S (update_svar_val X (eval ρ psi) ρ)) phi^{svar:0↦fresh_svar phi})
LeastFixpointOf (λ S : propset M, eval (update_svar_val (fresh_svar phi^[[svar:X↦psi]]) S ρ) phi^[[svar:X↦psi]]^{svar:0↦ fresh_svar phi^[[svar:X↦psi]]}) = LeastFixpointOf (λ S : propset M, eval (update_svar_val (fresh_svar phi) S (update_svar_val X (eval ρ psi) ρ)) phi^{svar:0↦fresh_svar phi})
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M

eval (update_svar_val (fresh_svar phi^[[svar:X↦psi]]) x ρ) phi^[[svar:X↦psi]]^{svar:0↦fresh_svar phi^[[svar:X↦psi]]} = eval (update_svar_val (fresh_svar phi) x (update_svar_val X (eval ρ psi) ρ)) phi^{svar:0↦fresh_svar phi}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
H: (λ S : propset M, eval (update_svar_val (fresh_svar phi^[[svar:X↦psi]]) S ρ) phi^[[svar:X↦psi]]^{svar:0↦ fresh_svar phi^[[svar:X↦psi]]}) = (λ S : propset M, eval (update_svar_val (fresh_svar phi) S (update_svar_val X (eval ρ psi) ρ)) phi^{svar:0↦fresh_svar phi})
LeastFixpointOf (λ S : propset M, eval (update_svar_val (fresh_svar phi^[[svar:X↦psi]]) S ρ) phi^[[svar:X↦psi]]^{svar:0↦ fresh_svar phi^[[svar:X↦psi]]}) = LeastFixpointOf (λ S : propset M, eval (update_svar_val (fresh_svar phi) S (update_svar_val X (eval ρ psi) ρ)) phi^{svar:0↦fresh_svar phi})
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M

eval (update_svar_val (fresh_svar phi^[[svar:X↦psi]]) x ρ) phi^[[svar:X↦psi]]^{svar:0↦fresh_svar phi^[[svar:X↦psi]]} = eval (update_svar_val (fresh_svar phi) x (update_svar_val X (eval ρ psi) ρ)) phi^{svar:0↦fresh_svar phi}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
B: SVarSet
HeqB: B = free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)

eval (update_svar_val (fresh_svar phi^[[svar:X↦psi]]) x ρ) phi^[[svar:X↦psi]]^{svar:0↦fresh_svar phi^[[svar:X↦psi]]} = eval (update_svar_val (fresh_svar phi) x (update_svar_val X (eval ρ psi) ρ)) phi^{svar:0↦fresh_svar phi}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
B: SVarSet
HeqB: B = free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements B)

eval (update_svar_val (fresh_svar phi^[[svar:X↦psi]]) x ρ) phi^[[svar:X↦psi]]^{svar:0↦fresh_svar phi^[[svar:X↦psi]]} = eval (update_svar_val (fresh_svar phi) x (update_svar_val X (eval ρ psi) ρ)) phi^{svar:0↦fresh_svar phi}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
B: SVarSet
HeqB: B = free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements B)
MuX: svar
HeqMuX: MuX = fresh_svar phi

eval (update_svar_val (fresh_svar phi^[[svar:X↦psi]]) x ρ) phi^[[svar:X↦psi]]^{svar:0↦fresh_svar phi^[[svar:X↦psi]]} = eval (update_svar_val MuX x (update_svar_val X (eval ρ psi) ρ)) phi^{svar:0↦MuX}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
B: SVarSet
HeqB: B = free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements B)
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]

eval (update_svar_val MuY x ρ) phi^[[svar:X↦psi]]^{svar:0↦MuY} = eval (update_svar_val MuX x (update_svar_val X (eval ρ psi) ρ)) phi^{svar:0↦MuX}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
B: SVarSet
HeqB: B = free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements B)
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]

MuZ ∉ B
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
B: SVarSet
HeqB: B = free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements B)
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ B
eval (update_svar_val MuY x ρ) phi^[[svar:X↦psi]]^{svar:0↦MuY} = eval (update_svar_val MuX x (update_svar_val X (eval ρ psi) ρ)) phi^{svar:0↦MuX}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
B: SVarSet
HeqB: B = free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements B)
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]

MuZ ∉ B
signature: Signature
M: Model
phi: Pattern
IHsz: (phi0 psi : Pattern) (X : svar) (ρ : Valuation), size phi0 ≤ size phi → well_formed psi → well_formed_closed phi0 → eval ρ phi0^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi0
psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S (size phi)
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
x: propset M

svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X))) ∉ free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)
apply set_svar_fresh_is_fresh'.
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
B: SVarSet
HeqB: B = free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements B)
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ B

eval (update_svar_val MuY x ρ) phi^[[svar:X↦psi]]^{svar:0↦MuY} = eval (update_svar_val MuX x (update_svar_val X (eval ρ psi) ρ)) phi^{svar:0↦MuX}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)

eval (update_svar_val MuY x ρ) phi^[[svar:X↦psi]]^{svar:0↦MuY} = eval (update_svar_val MuX x (update_svar_val X (eval ρ psi) ρ)) phi^{svar:0↦MuX}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: (MuZ ∉ free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]]) ∧ MuZ ∉ free_svars (patt_free_svar X)

eval (update_svar_val MuY x ρ) phi^[[svar:X↦psi]]^{svar:0↦MuY} = eval (update_svar_val MuX x (update_svar_val X (eval ρ psi) ρ)) phi^{svar:0↦MuX}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)

eval (update_svar_val MuY x ρ) phi^[[svar:X↦psi]]^{svar:0↦MuY} = eval (update_svar_val MuX x (update_svar_val X (eval ρ psi) ρ)) phi^{svar:0↦MuX}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: (MuZ ∉ free_svars phi ∪ free_svars psi) ∧ MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)

eval (update_svar_val MuY x ρ) phi^[[svar:X↦psi]]^{svar:0↦MuY} = eval (update_svar_val MuX x (update_svar_val X (eval ρ psi) ρ)) phi^{svar:0↦MuX}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi ∪ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)

eval (update_svar_val MuY x ρ) phi^[[svar:X↦psi]]^{svar:0↦MuY} = eval (update_svar_val MuX x (update_svar_val X (eval ρ psi) ρ)) phi^{svar:0↦MuX}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: (MuZ ∉ free_svars phi) ∧ MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)

eval (update_svar_val MuY x ρ) phi^[[svar:X↦psi]]^{svar:0↦MuY} = eval (update_svar_val MuX x (update_svar_val X (eval ρ psi) ρ)) phi^{svar:0↦MuX}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)

eval (update_svar_val MuY x ρ) phi^[[svar:X↦psi]]^{svar:0↦MuY} = eval (update_svar_val MuX x (update_svar_val X (eval ρ psi) ρ)) phi^{svar:0↦MuX}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)

eval (update_svar_val MuY x ρ) phi^[[svar:X↦psi]]^{svar:0↦MuY} = eval (update_svar_val MuZ x (update_svar_val X (eval ρ psi) ρ)) phi^{svar:0↦MuZ}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)
svar_is_fresh_in MuX phi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)

eval (update_svar_val MuZ x ρ) phi^[[svar:X↦psi]]^{svar:0↦MuZ} = eval (update_svar_val MuZ x (update_svar_val X (eval ρ psi) ρ)) phi^{svar:0↦MuZ}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)
svar_is_fresh_in MuY phi^[[svar:X↦psi]]
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)
svar_is_fresh_in MuX phi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)

eval (update_svar_val MuZ x ρ) phi^{svar:0↦MuZ}^[[svar:X↦psi]] = eval (update_svar_val MuZ x (update_svar_val X (eval ρ psi) ρ)) phi^{svar:0↦MuZ}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)
well_formed_closed_mu_aux psi 0
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)
MuZ ≠ X
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)
svar_is_fresh_in MuY phi^[[svar:X↦psi]]
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)
svar_is_fresh_in MuX phi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)

MuZ ≠ X
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)
eval (update_svar_val MuZ x ρ) phi^{svar:0↦MuZ}^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) (update_svar_val MuZ x ρ)) phi^{svar:0↦MuZ}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)
well_formed_closed_mu_aux psi 0
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)
MuZ ≠ X
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)
svar_is_fresh_in MuY phi^[[svar:X↦psi]]
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)
svar_is_fresh_in MuX phi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)

MuZ ≠ X
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ {[X]}

MuZ ≠ X
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ≠ X

MuZ ≠ X
assumption.
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)

eval (update_svar_val MuZ x ρ) phi^{svar:0↦MuZ}^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) (update_svar_val MuZ x ρ)) phi^{svar:0↦MuZ}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)
well_formed_closed_mu_aux psi 0
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)
MuZ ≠ X
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)
svar_is_fresh_in MuY phi^[[svar:X↦psi]]
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)
svar_is_fresh_in MuX phi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)
e:= IHsz phi^{svar:0↦MuZ} psi X (update_svar_val MuZ x ρ) ?Goal21 ?Goal22 ?Goal23: eval (update_svar_val MuZ x ρ) phi^{svar:0↦MuZ}^[[svar:X↦psi]] = eval (update_svar_val X (eval (update_svar_val MuZ x ρ) psi) (update_svar_val MuZ x ρ)) phi^{svar:0↦MuZ}

eval (update_svar_val MuZ x ρ) phi^{svar:0↦MuZ}^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) (update_svar_val MuZ x ρ)) phi^{svar:0↦MuZ}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)
well_formed_closed_mu_aux psi 0
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)
MuZ ≠ X
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)
svar_is_fresh_in MuY phi^[[svar:X↦psi]]
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)
svar_is_fresh_in MuX phi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)
e:= IHsz phi^{svar:0↦MuZ} psi X (update_svar_val MuZ x ρ) ?Goal21 ?Goal22 ?Goal23: eval (update_svar_val MuZ x ρ) phi^{svar:0↦MuZ}^[[svar:X↦psi]] = eval (update_svar_val X (eval (update_svar_val MuZ x ρ) psi) (update_svar_val MuZ x ρ)) phi^{svar:0↦MuZ}

eval (update_svar_val X (eval (update_svar_val MuZ x ρ) psi) (update_svar_val MuZ x ρ)) phi^{svar:0↦MuZ} = eval (update_svar_val X (eval ρ psi) (update_svar_val MuZ x ρ)) phi^{svar:0↦MuZ}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)
well_formed_closed_mu_aux psi 0
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)
MuZ ≠ X
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)
svar_is_fresh_in MuY phi^[[svar:X↦psi]]
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)
svar_is_fresh_in MuX phi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)
e:= IHsz phi^{svar:0↦MuZ} psi X (update_svar_val MuZ x ρ) ?Goal21 ?Goal22 ?Goal23: eval (update_svar_val MuZ x ρ) phi^{svar:0↦MuZ}^[[svar:X↦psi]] = eval (update_svar_val X (eval (update_svar_val MuZ x ρ) psi) (update_svar_val MuZ x ρ)) phi^{svar:0↦MuZ}

eval (update_svar_val X (eval ρ psi) (update_svar_val MuZ x ρ)) phi^{svar:0↦MuZ} = eval (update_svar_val X (eval ρ psi) (update_svar_val MuZ x ρ)) phi^{svar:0↦MuZ}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)
e:= IHsz phi^{svar:0↦MuZ} psi X (update_svar_val MuZ x ρ) ?Goal21 ?Goal22 ?Goal23: eval (update_svar_val MuZ x ρ) phi^{svar:0↦MuZ}^[[svar:X↦psi]] = eval (update_svar_val X (eval (update_svar_val MuZ x ρ) psi) (update_svar_val MuZ x ρ)) phi^{svar:0↦MuZ}
svar_is_fresh_in MuZ psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)
well_formed_closed_mu_aux psi 0
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)
MuZ ≠ X
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)
svar_is_fresh_in MuY phi^[[svar:X↦psi]]
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)
svar_is_fresh_in MuX phi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)
e:= IHsz phi^{svar:0↦MuZ} psi X (update_svar_val MuZ x ρ) ?Goal21 ?Goal22 ?Goal23: eval (update_svar_val MuZ x ρ) phi^{svar:0↦MuZ}^[[svar:X↦psi]] = eval (update_svar_val X (eval (update_svar_val MuZ x ρ) psi) (update_svar_val MuZ x ρ)) phi^{svar:0↦MuZ}

svar_is_fresh_in MuZ psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)
well_formed_closed_mu_aux psi 0
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)
MuZ ≠ X
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)
svar_is_fresh_in MuY phi^[[svar:X↦psi]]
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)
svar_is_fresh_in MuX phi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)

well_formed_closed_mu_aux psi 0
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)
MuZ ≠ X
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)
svar_is_fresh_in MuY phi^[[svar:X↦psi]]
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)
svar_is_fresh_in MuX phi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)

well_formed_closed_mu_aux psi 0
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed_closed psi = true
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)

well_formed_closed_mu_aux psi 0
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed_closed_mu_aux psi 0 = true
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)

well_formed_closed_mu_aux psi 0
apply Hwf.
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)

MuZ ≠ X
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)
svar_is_fresh_in MuY phi^[[svar:X↦psi]]
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)
svar_is_fresh_in MuX phi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)

MuZ ≠ X
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ {[X]}

MuZ ≠ X
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ≠ X

MuZ ≠ X
assumption.
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)

svar_is_fresh_in MuY phi^[[svar:X↦psi]]
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)
svar_is_fresh_in MuX phi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)

svar_is_fresh_in MuY phi^[[svar:X↦psi]]
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)

svar_is_fresh_in (fresh_svar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
apply set_svar_fresh_is_fresh.
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)

svar_is_fresh_in MuX phi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)

svar_is_fresh_in MuX phi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)

svar_is_fresh_in (fresh_svar phi) phi
apply set_svar_fresh_is_fresh. }
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
H: (λ S : propset M, eval (update_svar_val (fresh_svar phi^[[svar:X↦psi]]) S ρ) phi^[[svar:X↦psi]]^{svar:0↦ fresh_svar phi^[[svar:X↦psi]]}) = (λ S : propset M, eval (update_svar_val (fresh_svar phi) S (update_svar_val X (eval ρ psi) ρ)) phi^{svar:0↦fresh_svar phi})

LeastFixpointOf (λ S : propset M, eval (update_svar_val (fresh_svar phi^[[svar:X↦psi]]) S ρ) phi^[[svar:X↦psi]]^{svar:0↦fresh_svar phi^[[svar:X↦psi]]}) = LeastFixpointOf (λ S : propset M, eval (update_svar_val (fresh_svar phi) S (update_svar_val X (eval ρ psi) ρ)) phi^{svar:0↦fresh_svar phi})
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
H: (λ S : propset M, eval (update_svar_val (fresh_svar phi^[[svar:X↦psi]]) S ρ) phi^[[svar:X↦psi]]^{svar:0↦ fresh_svar phi^[[svar:X↦psi]]}) = (λ S : propset M, eval (update_svar_val (fresh_svar phi) S (update_svar_val X (eval ρ psi) ρ)) phi^{svar:0↦fresh_svar phi})

LeastFixpointOf (λ S : propset M, eval (update_svar_val (fresh_svar phi^[[svar:X↦psi]]) S ρ) phi^[[svar:X↦psi]]^{svar:0↦fresh_svar phi^[[svar:X↦psi]]}) = LeastFixpointOf (λ S : propset M, eval (update_svar_val (fresh_svar phi) S (update_svar_val X (eval ρ psi) ρ)) phi^{svar:0↦fresh_svar phi})
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
H: (λ S : propset M, eval (update_svar_val (fresh_svar phi^[[svar:X↦psi]]) S ρ) phi^[[svar:X↦psi]]^{svar:0↦ fresh_svar phi^[[svar:X↦psi]]}) = (λ S : propset M, eval (update_svar_val (fresh_svar phi) S (update_svar_val X (eval ρ psi) ρ)) phi^{svar:0↦fresh_svar phi})

LeastFixpointOf (λ S : propset M, eval (update_svar_val (fresh_svar phi) S (update_svar_val X (eval ρ psi) ρ)) phi^{svar:0↦fresh_svar phi}) = LeastFixpointOf (λ S : propset M, eval (update_svar_val (fresh_svar phi) S (update_svar_val X (eval ρ psi) ρ)) phi^{svar:0↦fresh_svar phi})
reflexivity. (* replace 1 with (0 + 1) by lia. rewrite -free_svar_subst_nest_mu_1. rewrite nest_mu_aux_wfc_mu. { unfold well_formed,well_formed_closed in Hwf. destruct_and!. assumption. } rewrite H. reflexivity. *)
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz

eval ρ (mu , (fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) (mu , phi)
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz

(let X0 := fresh_svar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi) in LeastFixpointOf (λ S : propset M, let ρ' := update_svar_val X0 S ρ in eval ρ' ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{svar:0↦X0})) = (let X0 := fresh_svar phi in LeastFixpointOf (λ S : propset M, let ρ' := update_svar_val X0 S (update_svar_val X (eval ρ psi) ρ) in eval ρ' phi^{svar:0↦X0}))
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz

LeastFixpointOf (λ S : propset M, eval (update_svar_val (fresh_svar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)) S ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{svar:0↦fresh_svar ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)}) = LeastFixpointOf (λ S : propset M, eval (update_svar_val (fresh_svar phi) S (update_svar_val X (eval ρ psi) ρ)) phi^{svar:0↦fresh_svar phi})
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz

LeastFixpointOf (λ S : propset M, eval (update_svar_val (fresh_svar phi^[[svar:X↦psi]]) S ρ) phi^[[svar:X↦psi]]^{svar:0↦fresh_svar phi^[[svar:X↦psi]]}) = LeastFixpointOf (λ S : propset M, eval (update_svar_val (fresh_svar phi) S (update_svar_val X (eval ρ psi) ρ)) phi^{svar:0↦fresh_svar phi})
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz

(λ S : propset M, eval (update_svar_val (fresh_svar phi^[[svar:X↦psi]]) S ρ) phi^[[svar:X↦psi]]^{svar:0↦fresh_svar phi^[[svar:X↦psi]]}) = (λ S : propset M, eval (update_svar_val (fresh_svar phi) S (update_svar_val X (eval ρ psi) ρ)) phi^{svar:0↦fresh_svar phi})
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
H1: (λ S : propset M, eval (update_svar_val (fresh_svar phi^[[svar:X↦psi]]) S ρ) phi^[[svar:X↦psi]]^{svar:0↦ fresh_svar phi^[[svar:X↦psi]]}) = (λ S : propset M, eval (update_svar_val (fresh_svar phi) S (update_svar_val X (eval ρ psi) ρ)) phi^{svar:0↦fresh_svar phi})
LeastFixpointOf (λ S : propset M, eval (update_svar_val (fresh_svar phi^[[svar:X↦psi]]) S ρ) phi^[[svar:X↦psi]]^{svar:0↦ fresh_svar phi^[[svar:X↦psi]]}) = LeastFixpointOf (λ S : propset M, eval (update_svar_val (fresh_svar phi) S (update_svar_val X (eval ρ psi) ρ)) phi^{svar:0↦fresh_svar phi})
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz

x : propset M, eval (update_svar_val (fresh_svar phi^[[svar:X↦psi]]) x ρ) phi^[[svar:X↦psi]]^{svar:0↦fresh_svar phi^[[svar:X↦psi]]} = eval (update_svar_val (fresh_svar phi) x (update_svar_val X (eval ρ psi) ρ)) phi^{svar:0↦fresh_svar phi}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
H1: (λ S : propset M, eval (update_svar_val (fresh_svar phi^[[svar:X↦psi]]) S ρ) phi^[[svar:X↦psi]]^{svar:0↦ fresh_svar phi^[[svar:X↦psi]]}) = (λ S : propset M, eval (update_svar_val (fresh_svar phi) S (update_svar_val X (eval ρ psi) ρ)) phi^{svar:0↦fresh_svar phi})
LeastFixpointOf (λ S : propset M, eval (update_svar_val (fresh_svar phi^[[svar:X↦psi]]) S ρ) phi^[[svar:X↦psi]]^{svar:0↦ fresh_svar phi^[[svar:X↦psi]]}) = LeastFixpointOf (λ S : propset M, eval (update_svar_val (fresh_svar phi) S (update_svar_val X (eval ρ psi) ρ)) phi^{svar:0↦fresh_svar phi})
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M

eval (update_svar_val (fresh_svar phi^[[svar:X↦psi]]) x ρ) phi^[[svar:X↦psi]]^{svar:0↦fresh_svar phi^[[svar:X↦psi]]} = eval (update_svar_val (fresh_svar phi) x (update_svar_val X (eval ρ psi) ρ)) phi^{svar:0↦fresh_svar phi}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
H1: (λ S : propset M, eval (update_svar_val (fresh_svar phi^[[svar:X↦psi]]) S ρ) phi^[[svar:X↦psi]]^{svar:0↦ fresh_svar phi^[[svar:X↦psi]]}) = (λ S : propset M, eval (update_svar_val (fresh_svar phi) S (update_svar_val X (eval ρ psi) ρ)) phi^{svar:0↦fresh_svar phi})
LeastFixpointOf (λ S : propset M, eval (update_svar_val (fresh_svar phi^[[svar:X↦psi]]) S ρ) phi^[[svar:X↦psi]]^{svar:0↦ fresh_svar phi^[[svar:X↦psi]]}) = LeastFixpointOf (λ S : propset M, eval (update_svar_val (fresh_svar phi) S (update_svar_val X (eval ρ psi) ρ)) phi^{svar:0↦fresh_svar phi})
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M

eval (update_svar_val (fresh_svar phi^[[svar:X↦psi]]) x ρ) phi^[[svar:X↦psi]]^{svar:0↦fresh_svar phi^[[svar:X↦psi]]} = eval (update_svar_val (fresh_svar phi) x (update_svar_val X (eval ρ psi) ρ)) phi^{svar:0↦fresh_svar phi}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
B: SVarSet
HeqB: B = free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)

eval (update_svar_val (fresh_svar phi^[[svar:X↦psi]]) x ρ) phi^[[svar:X↦psi]]^{svar:0↦fresh_svar phi^[[svar:X↦psi]]} = eval (update_svar_val (fresh_svar phi) x (update_svar_val X (eval ρ psi) ρ)) phi^{svar:0↦fresh_svar phi}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
B: SVarSet
HeqB: B = free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements B)

eval (update_svar_val (fresh_svar phi^[[svar:X↦psi]]) x ρ) phi^[[svar:X↦psi]]^{svar:0↦fresh_svar phi^[[svar:X↦psi]]} = eval (update_svar_val (fresh_svar phi) x (update_svar_val X (eval ρ psi) ρ)) phi^{svar:0↦fresh_svar phi}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
B: SVarSet
HeqB: B = free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements B)
MuX: svar
HeqMuX: MuX = fresh_svar phi

eval (update_svar_val (fresh_svar phi^[[svar:X↦psi]]) x ρ) phi^[[svar:X↦psi]]^{svar:0↦fresh_svar phi^[[svar:X↦psi]]} = eval (update_svar_val MuX x (update_svar_val X (eval ρ psi) ρ)) phi^{svar:0↦MuX}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
B: SVarSet
HeqB: B = free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements B)
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]

eval (update_svar_val MuY x ρ) phi^[[svar:X↦psi]]^{svar:0↦MuY} = eval (update_svar_val MuX x (update_svar_val X (eval ρ psi) ρ)) phi^{svar:0↦MuX}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
B: SVarSet
HeqB: B = free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements B)
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]

MuZ ∉ B
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
B: SVarSet
HeqB: B = free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements B)
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ B
eval (update_svar_val MuY x ρ) phi^[[svar:X↦psi]]^{svar:0↦MuY} = eval (update_svar_val MuX x (update_svar_val X (eval ρ psi) ρ)) phi^{svar:0↦MuX}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
B: SVarSet
HeqB: B = free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements B)
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]

MuZ ∉ B
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: S (size phi) ≤ sz
x: propset M

svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X))) ∉ free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)
apply set_svar_fresh_is_fresh'.
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
B: SVarSet
HeqB: B = free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements B)
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ B

eval (update_svar_val MuY x ρ) phi^[[svar:X↦psi]]^{svar:0↦MuY} = eval (update_svar_val MuX x (update_svar_val X (eval ρ psi) ρ)) phi^{svar:0↦MuX}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)

eval (update_svar_val MuY x ρ) phi^[[svar:X↦psi]]^{svar:0↦MuY} = eval (update_svar_val MuX x (update_svar_val X (eval ρ psi) ρ)) phi^{svar:0↦MuX}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: (MuZ ∉ free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]]) ∧ MuZ ∉ free_svars (patt_free_svar X)

eval (update_svar_val MuY x ρ) phi^[[svar:X↦psi]]^{svar:0↦MuY} = eval (update_svar_val MuX x (update_svar_val X (eval ρ psi) ρ)) phi^{svar:0↦MuX}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)

eval (update_svar_val MuY x ρ) phi^[[svar:X↦psi]]^{svar:0↦MuY} = eval (update_svar_val MuX x (update_svar_val X (eval ρ psi) ρ)) phi^{svar:0↦MuX}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: (MuZ ∉ free_svars phi ∪ free_svars psi) ∧ MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)

eval (update_svar_val MuY x ρ) phi^[[svar:X↦psi]]^{svar:0↦MuY} = eval (update_svar_val MuX x (update_svar_val X (eval ρ psi) ρ)) phi^{svar:0↦MuX}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi ∪ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)

eval (update_svar_val MuY x ρ) phi^[[svar:X↦psi]]^{svar:0↦MuY} = eval (update_svar_val MuX x (update_svar_val X (eval ρ psi) ρ)) phi^{svar:0↦MuX}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: (MuZ ∉ free_svars phi) ∧ MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)

eval (update_svar_val MuY x ρ) phi^[[svar:X↦psi]]^{svar:0↦MuY} = eval (update_svar_val MuX x (update_svar_val X (eval ρ psi) ρ)) phi^{svar:0↦MuX}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)

eval (update_svar_val MuY x ρ) phi^[[svar:X↦psi]]^{svar:0↦MuY} = eval (update_svar_val MuX x (update_svar_val X (eval ρ psi) ρ)) phi^{svar:0↦MuX}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)

eval (update_svar_val MuY x ρ) phi^[[svar:X↦psi]]^{svar:0↦MuY} = eval (update_svar_val MuZ x (update_svar_val X (eval ρ psi) ρ)) phi^{svar:0↦MuZ}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)
svar_is_fresh_in MuX phi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)

eval (update_svar_val MuZ x ρ) phi^[[svar:X↦psi]]^{svar:0↦MuZ} = eval (update_svar_val MuZ x (update_svar_val X (eval ρ psi) ρ)) phi^{svar:0↦MuZ}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)
svar_is_fresh_in MuY phi^[[svar:X↦psi]]
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)
svar_is_fresh_in MuX phi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)

eval (update_svar_val MuZ x ρ) phi^{svar:0↦MuZ}^[[svar:X↦psi]] = eval (update_svar_val MuZ x (update_svar_val X (eval ρ psi) ρ)) phi^{svar:0↦MuZ}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)
well_formed_closed_mu_aux psi 0
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)
MuZ ≠ X
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)
svar_is_fresh_in MuY phi^[[svar:X↦psi]]
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)
svar_is_fresh_in MuX phi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)

MuZ ≠ X
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)
eval (update_svar_val MuZ x ρ) phi^{svar:0↦MuZ}^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) (update_svar_val MuZ x ρ)) phi^{svar:0↦MuZ}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)
well_formed_closed_mu_aux psi 0
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)
MuZ ≠ X
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)
svar_is_fresh_in MuY phi^[[svar:X↦psi]]
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)
svar_is_fresh_in MuX phi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)

MuZ ≠ X
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ {[X]}

MuZ ≠ X
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ≠ X

MuZ ≠ X
assumption.
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)

eval (update_svar_val MuZ x ρ) phi^{svar:0↦MuZ}^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) (update_svar_val MuZ x ρ)) phi^{svar:0↦MuZ}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)
well_formed_closed_mu_aux psi 0
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)
MuZ ≠ X
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)
svar_is_fresh_in MuY phi^[[svar:X↦psi]]
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)
svar_is_fresh_in MuX phi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)
e:= IHsz phi^{svar:0↦MuZ} psi X (update_svar_val MuZ x ρ) ?Goal23 ?Goal24: well_formed_closed phi^{svar:0↦MuZ} → eval (update_svar_val MuZ x ρ) phi^{svar:0↦MuZ}^[[svar:X↦psi]] = eval (update_svar_val X (eval (update_svar_val MuZ x ρ) psi) (update_svar_val MuZ x ρ)) phi^{svar:0↦MuZ}

eval (update_svar_val MuZ x ρ) phi^{svar:0↦MuZ}^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) (update_svar_val MuZ x ρ)) phi^{svar:0↦MuZ}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)
well_formed_closed_mu_aux psi 0
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)
MuZ ≠ X
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)
svar_is_fresh_in MuY phi^[[svar:X↦psi]]
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)
svar_is_fresh_in MuX phi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)
e:= IHsz phi^{svar:0↦MuZ} psi X (update_svar_val MuZ x ρ) ?Goal23 ?Goal24: well_formed_closed phi^{svar:0↦MuZ} → eval (update_svar_val MuZ x ρ) phi^{svar:0↦MuZ}^[[svar:X↦psi]] = eval (update_svar_val X (eval (update_svar_val MuZ x ρ) psi) (update_svar_val MuZ x ρ)) phi^{svar:0↦MuZ}

well_formed_closed phi^{svar:0↦MuZ}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)
e:= IHsz phi^{svar:0↦MuZ} psi X (update_svar_val MuZ x ρ) ?Goal23 ?Goal24: well_formed_closed phi^{svar:0↦MuZ} → eval (update_svar_val MuZ x ρ) phi^{svar:0↦MuZ}^[[svar:X↦psi]] = eval (update_svar_val X (eval (update_svar_val MuZ x ρ) psi) (update_svar_val MuZ x ρ)) phi^{svar:0↦MuZ}
eval (update_svar_val X (eval (update_svar_val MuZ x ρ) psi) (update_svar_val MuZ x ρ)) phi^{svar:0↦MuZ} = eval (update_svar_val X (eval ρ psi) (update_svar_val MuZ x ρ)) phi^{svar:0↦MuZ}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)
well_formed_closed_mu_aux psi 0
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)
MuZ ≠ X
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)
svar_is_fresh_in MuY phi^[[svar:X↦psi]]
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)
svar_is_fresh_in MuX phi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)
e:= IHsz phi^{svar:0↦MuZ} psi X (update_svar_val MuZ x ρ) ?Goal23 ?Goal24: well_formed_closed phi^{svar:0↦MuZ} → eval (update_svar_val MuZ x ρ) phi^{svar:0↦MuZ}^[[svar:X↦psi]] = eval (update_svar_val X (eval (update_svar_val MuZ x ρ) psi) (update_svar_val MuZ x ρ)) phi^{svar:0↦MuZ}

well_formed_closed phi^{svar:0↦MuZ}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc1: well_formed_closed_mu_aux (mu , phi) 0 = true
Hwfc2: well_formed_closed_ex_aux (mu , phi) 0 = true
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)
e:= IHsz phi^{svar:0↦MuZ} psi X (update_svar_val MuZ x ρ) ?Goal24 ?Goal25: well_formed_closed phi^{svar:0↦MuZ} → eval (update_svar_val MuZ x ρ) phi^{svar:0↦MuZ}^[[svar:X↦psi]] = eval (update_svar_val X (eval (update_svar_val MuZ x ρ) psi) (update_svar_val MuZ x ρ)) phi^{svar:0↦MuZ}

well_formed_closed phi^{svar:0↦MuZ}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc1: well_formed_closed_mu_aux phi 1 = true
Hwfc2: well_formed_closed_ex_aux phi 0 = true
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)
e:= IHsz phi^{svar:0↦MuZ} psi X (update_svar_val MuZ x ρ) ?Goal24 ?Goal25: well_formed_closed phi^{svar:0↦MuZ} → eval (update_svar_val MuZ x ρ) phi^{svar:0↦MuZ}^[[svar:X↦psi]] = eval (update_svar_val X (eval (update_svar_val MuZ x ρ) psi) (update_svar_val MuZ x ρ)) phi^{svar:0↦MuZ}

well_formed_closed phi^{svar:0↦MuZ}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc1: well_formed_closed_mu_aux phi 1 = true
Hwfc2: well_formed_closed_ex_aux phi 0 = true
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)
e:= IHsz phi^{svar:0↦MuZ} psi X (update_svar_val MuZ x ρ) ?Goal24 ?Goal25: well_formed_closed phi^{svar:0↦MuZ} → eval (update_svar_val MuZ x ρ) phi^{svar:0↦MuZ}^[[svar:X↦psi]] = eval (update_svar_val X (eval (update_svar_val MuZ x ρ) psi) (update_svar_val MuZ x ρ)) phi^{svar:0↦MuZ}

well_formed_closed_mu_aux phi^{svar:0↦MuZ} 0 = true ∧ well_formed_closed_ex_aux phi^{svar:0↦MuZ} 0 = true
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc1: well_formed_closed_mu_aux phi 1 = true
Hwfc2: well_formed_closed_ex_aux phi 0 = true
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)
e:= IHsz phi^{svar:0↦MuZ} psi X (update_svar_val MuZ x ρ) ?Goal24 ?Goal25: well_formed_closed phi^{svar:0↦MuZ} → eval (update_svar_val MuZ x ρ) phi^{svar:0↦MuZ}^[[svar:X↦psi]] = eval (update_svar_val X (eval (update_svar_val MuZ x ρ) psi) (update_svar_val MuZ x ρ)) phi^{svar:0↦MuZ}

well_formed_closed_mu_aux phi^{svar:0↦MuZ} 0 = true
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc1: well_formed_closed_mu_aux phi 1 = true
Hwfc2: well_formed_closed_ex_aux phi 0 = true
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)
e:= IHsz phi^{svar:0↦MuZ} psi X (update_svar_val MuZ x ρ) ?Goal24 ?Goal25: well_formed_closed phi^{svar:0↦MuZ} → eval (update_svar_val MuZ x ρ) phi^{svar:0↦MuZ}^[[svar:X↦psi]] = eval (update_svar_val X (eval (update_svar_val MuZ x ρ) psi) (update_svar_val MuZ x ρ)) phi^{svar:0↦MuZ}
well_formed_closed_ex_aux phi^{svar:0↦MuZ} 0 = true
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc1: well_formed_closed_mu_aux phi 1 = true
Hwfc2: well_formed_closed_ex_aux phi 0 = true
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)
e:= IHsz phi^{svar:0↦MuZ} psi X (update_svar_val MuZ x ρ) ?Goal24 ?Goal25: well_formed_closed phi^{svar:0↦MuZ} → eval (update_svar_val MuZ x ρ) phi^{svar:0↦MuZ}^[[svar:X↦psi]] = eval (update_svar_val X (eval (update_svar_val MuZ x ρ) psi) (update_svar_val MuZ x ρ)) phi^{svar:0↦MuZ}

well_formed_closed_mu_aux phi^{svar:0↦MuZ} 0 = true
now apply wfc_mu_aux_body_mu_imp1.
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc1: well_formed_closed_mu_aux phi 1 = true
Hwfc2: well_formed_closed_ex_aux phi 0 = true
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)
e:= IHsz phi^{svar:0↦MuZ} psi X (update_svar_val MuZ x ρ) ?Goal24 ?Goal25: well_formed_closed phi^{svar:0↦MuZ} → eval (update_svar_val MuZ x ρ) phi^{svar:0↦MuZ}^[[svar:X↦psi]] = eval (update_svar_val X (eval (update_svar_val MuZ x ρ) psi) (update_svar_val MuZ x ρ)) phi^{svar:0↦MuZ}

well_formed_closed_ex_aux phi^{svar:0↦MuZ} 0 = true
now apply wfc_ex_aux_body_mu_imp1.
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)
e:= IHsz phi^{svar:0↦MuZ} psi X (update_svar_val MuZ x ρ) ?Goal24 ?Goal25: well_formed_closed phi^{svar:0↦MuZ} → eval (update_svar_val MuZ x ρ) phi^{svar:0↦MuZ}^[[svar:X↦psi]] = eval (update_svar_val X (eval (update_svar_val MuZ x ρ) psi) (update_svar_val MuZ x ρ)) phi^{svar:0↦MuZ}

eval (update_svar_val X (eval (update_svar_val MuZ x ρ) psi) (update_svar_val MuZ x ρ)) phi^{svar:0↦MuZ} = eval (update_svar_val X (eval ρ psi) (update_svar_val MuZ x ρ)) phi^{svar:0↦MuZ}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)
well_formed_closed_mu_aux psi 0
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)
MuZ ≠ X
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)
svar_is_fresh_in MuY phi^[[svar:X↦psi]]
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)
svar_is_fresh_in MuX phi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)
e:= IHsz phi^{svar:0↦MuZ} psi X (update_svar_val MuZ x ρ) ?Goal23 ?Goal24: well_formed_closed phi^{svar:0↦MuZ} → eval (update_svar_val MuZ x ρ) phi^{svar:0↦MuZ}^[[svar:X↦psi]] = eval (update_svar_val X (eval (update_svar_val MuZ x ρ) psi) (update_svar_val MuZ x ρ)) phi^{svar:0↦MuZ}

eval (update_svar_val X (eval ρ psi) (update_svar_val MuZ x ρ)) phi^{svar:0↦MuZ} = eval (update_svar_val X (eval ρ psi) (update_svar_val MuZ x ρ)) phi^{svar:0↦MuZ}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)
well_formed_closed_mu_aux psi 0
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)
MuZ ≠ X
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)
svar_is_fresh_in MuY phi^[[svar:X↦psi]]
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)
svar_is_fresh_in MuX phi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)

well_formed_closed_mu_aux psi 0
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)
MuZ ≠ X
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)
svar_is_fresh_in MuY phi^[[svar:X↦psi]]
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)
svar_is_fresh_in MuX phi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: [&& well_formed_positive psi, well_formed_closed_mu_aux psi 0 & well_formed_closed_ex_aux psi 0]
Hwfc: well_formed_closed (mu , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)

well_formed_closed_mu_aux psi 0
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)
MuZ ≠ X
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)
svar_is_fresh_in MuY phi^[[svar:X↦psi]]
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)
svar_is_fresh_in MuX phi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
H5: well_formed_positive psi = true
H7: well_formed_closed_mu_aux psi 0 = true
H8: well_formed_closed_ex_aux psi 0 = true
Hwfc: well_formed_closed (mu , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)

well_formed_closed_mu_aux psi 0
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)
MuZ ≠ X
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)
svar_is_fresh_in MuY phi^[[svar:X↦psi]]
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)
svar_is_fresh_in MuX phi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)

MuZ ≠ X
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)
svar_is_fresh_in MuY phi^[[svar:X↦psi]]
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)
svar_is_fresh_in MuX phi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)

MuZ ≠ X
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ {[X]}

MuZ ≠ X
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ≠ X

MuZ ≠ X
assumption.
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)

svar_is_fresh_in MuY phi^[[svar:X↦psi]]
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)
svar_is_fresh_in MuX phi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)

svar_is_fresh_in MuY phi^[[svar:X↦psi]]
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)

svar_is_fresh_in (fresh_svar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
apply set_svar_fresh_is_fresh.
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)

svar_is_fresh_in MuX phi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)

svar_is_fresh_in MuX phi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)

svar_is_fresh_in (fresh_svar phi) phi
apply set_svar_fresh_is_fresh. }
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
H1: (λ S : propset M, eval (update_svar_val (fresh_svar phi^[[svar:X↦psi]]) S ρ) phi^[[svar:X↦psi]]^{svar:0↦ fresh_svar phi^[[svar:X↦psi]]}) = (λ S : propset M, eval (update_svar_val (fresh_svar phi) S (update_svar_val X (eval ρ psi) ρ)) phi^{svar:0↦fresh_svar phi})

LeastFixpointOf (λ S : propset M, eval (update_svar_val (fresh_svar phi^[[svar:X↦psi]]) S ρ) phi^[[svar:X↦psi]]^{svar:0↦fresh_svar phi^[[svar:X↦psi]]}) = LeastFixpointOf (λ S : propset M, eval (update_svar_val (fresh_svar phi) S (update_svar_val X (eval ρ psi) ρ)) phi^{svar:0↦fresh_svar phi})
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
H1: (λ S : propset M, eval (update_svar_val (fresh_svar phi^[[svar:X↦psi]]) S ρ) phi^[[svar:X↦psi]]^{svar:0↦ fresh_svar phi^[[svar:X↦psi]]}) = (λ S : propset M, eval (update_svar_val (fresh_svar phi) S (update_svar_val X (eval ρ psi) ρ)) phi^{svar:0↦fresh_svar phi})

LeastFixpointOf (λ S : propset M, eval (update_svar_val (fresh_svar phi^[[svar:X↦psi]]) S ρ) phi^[[svar:X↦psi]]^{svar:0↦fresh_svar phi^[[svar:X↦psi]]}) = LeastFixpointOf (λ S : propset M, eval (update_svar_val (fresh_svar phi) S (update_svar_val X (eval ρ psi) ρ)) phi^{svar:0↦fresh_svar phi})
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
H1: (λ S : propset M, eval (update_svar_val (fresh_svar phi^[[svar:X↦psi]]) S ρ) phi^[[svar:X↦psi]]^{svar:0↦ fresh_svar phi^[[svar:X↦psi]]}) = (λ S : propset M, eval (update_svar_val (fresh_svar phi) S (update_svar_val X (eval ρ psi) ρ)) phi^{svar:0↦fresh_svar phi})

LeastFixpointOf (λ S : propset M, eval (update_svar_val (fresh_svar phi) S (update_svar_val X (eval ρ psi) ρ)) phi^{svar:0↦fresh_svar phi}) = LeastFixpointOf (λ S : propset M, eval (update_svar_val (fresh_svar phi) S (update_svar_val X (eval ρ psi) ρ)) phi^{svar:0↦fresh_svar phi})
reflexivity.
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H: x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0fresh}
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi

evar_is_fresh_in (fresh_evar phi) phi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H: x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0fresh}
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi
evar_is_fresh_in fresh phi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H: x ∈ eval (update_evar_val fresh c ρ) phi^[[svar:X↦psi]]^{evar:0fresh}
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi
size phi^{evar:0fresh} ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H: x ∈ eval (update_evar_val fresh c ρ) phi^[[svar:X↦psi]]^{evar:0fresh}
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi
well_formed psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi
evar_is_fresh_in (fresh_evar phi) phi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi
evar_is_fresh_in fresh phi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi
H: x ∈ eval (update_evar_val fresh c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0fresh}
size phi^{evar:0fresh} ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi
H: x ∈ eval (update_evar_val fresh c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0fresh}
well_formed psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
fresh: evar
H1: x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0fresh}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
evar_is_fresh_in (fresh_evar phi) phi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
fresh: evar
H1: x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0fresh}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
evar_is_fresh_in fresh phi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
fresh: evar
H1: x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0fresh}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
size phi^{evar:0fresh} ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
fresh: evar
H1: x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0fresh}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
well_formed psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H1: x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
evar_is_fresh_in (fresh_evar phi) phi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H1: x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
evar_is_fresh_in fresh phi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
H1: x ∈ eval (update_evar_val fresh c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0fresh}
size phi^{evar:0fresh} ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
H1: x ∈ eval (update_evar_val fresh c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0fresh}
well_formed psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)
size phi^{svar:0↦MuZ} ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)
well_formed psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)
well_formed_closed phi^{svar:0↦MuZ}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)
size phi^{svar:0↦MuZ} ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)
well_formed psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H: x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0fresh}
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi

evar_is_fresh_in fresh phi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H: x ∈ eval (update_evar_val fresh c ρ) phi^[[svar:X↦psi]]^{evar:0fresh}
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi
size phi^{evar:0fresh} ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H: x ∈ eval (update_evar_val fresh c ρ) phi^[[svar:X↦psi]]^{evar:0fresh}
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi
well_formed psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi
evar_is_fresh_in (fresh_evar phi) phi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi
evar_is_fresh_in fresh phi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi
H: x ∈ eval (update_evar_val fresh c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0fresh}
size phi^{evar:0fresh} ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi
H: x ∈ eval (update_evar_val fresh c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0fresh}
well_formed psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
fresh: evar
H1: x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0fresh}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
evar_is_fresh_in (fresh_evar phi) phi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
fresh: evar
H1: x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0fresh}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
evar_is_fresh_in fresh phi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
fresh: evar
H1: x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0fresh}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
size phi^{evar:0fresh} ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
fresh: evar
H1: x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0fresh}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
well_formed psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H1: x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
evar_is_fresh_in (fresh_evar phi) phi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H1: x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
evar_is_fresh_in fresh phi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
H1: x ∈ eval (update_evar_val fresh c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0fresh}
size phi^{evar:0fresh} ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
H1: x ∈ eval (update_evar_val fresh c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0fresh}
well_formed psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)
size phi^{svar:0↦MuZ} ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)
well_formed psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)
well_formed_closed phi^{svar:0↦MuZ}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)
size phi^{svar:0↦MuZ} ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)
well_formed psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H: x ∈ eval (update_evar_val fresh c ρ) phi^[[svar:X↦psi]]^{evar:0fresh}
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi

size phi^{evar:0fresh} ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H: x ∈ eval (update_evar_val fresh c ρ) phi^[[svar:X↦psi]]^{evar:0fresh}
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi
well_formed psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi
evar_is_fresh_in (fresh_evar phi) phi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi
evar_is_fresh_in fresh phi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi
H: x ∈ eval (update_evar_val fresh c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0fresh}
size phi^{evar:0fresh} ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi
H: x ∈ eval (update_evar_val fresh c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0fresh}
well_formed psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
fresh: evar
H1: x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0fresh}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
evar_is_fresh_in (fresh_evar phi) phi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
fresh: evar
H1: x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0fresh}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
evar_is_fresh_in fresh phi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
fresh: evar
H1: x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0fresh}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
size phi^{evar:0fresh} ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
fresh: evar
H1: x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0fresh}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
well_formed psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H1: x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
evar_is_fresh_in (fresh_evar phi) phi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H1: x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
evar_is_fresh_in fresh phi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
H1: x ∈ eval (update_evar_val fresh c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0fresh}
size phi^{evar:0fresh} ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
H1: x ∈ eval (update_evar_val fresh c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0fresh}
well_formed psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)
size phi^{svar:0↦MuZ} ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)
well_formed psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)
well_formed_closed phi^{svar:0↦MuZ}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)
size phi^{svar:0↦MuZ} ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)
well_formed psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H: x ∈ eval (update_evar_val fresh c ρ) phi^[[svar:X↦psi]]^{evar:0fresh}
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi

size phi^{evar:0fresh} ≤ sz
signature: Signature
M: Model
phi: Pattern
IHsz: (phi0 psi : Pattern) (X : svar) (ρ : Valuation), size phi0 ≤ size phi → well_formed psi → well_formed_closed phi0 → eval ρ phi0^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi0
psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S (size phi)
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
c, x: M
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H: x ∈ eval (update_evar_val fresh c ρ) phi^[[svar:X↦psi]]^{evar:0fresh}
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi

size phi^{evar:0fresh} ≤ size phi
signature: Signature
M: Model
phi: Pattern
IHsz: (phi0 psi : Pattern) (X : svar) (ρ : Valuation), size phi0 ≤ size phi → well_formed psi → well_formed_closed phi0 → eval ρ phi0^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi0
psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S (size phi)
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
c, x: M
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H: x ∈ eval (update_evar_val fresh c ρ) phi^[[svar:X↦psi]]^{evar:0fresh}
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi

size phi ≤ size phi
reflexivity.
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H: x ∈ eval (update_evar_val fresh c ρ) phi^[[svar:X↦psi]]^{evar:0fresh}
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi

well_formed psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi
evar_is_fresh_in (fresh_evar phi) phi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi
evar_is_fresh_in fresh phi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi
H: x ∈ eval (update_evar_val fresh c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0fresh}
size phi^{evar:0fresh} ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi
H: x ∈ eval (update_evar_val fresh c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0fresh}
well_formed psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
fresh: evar
H1: x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0fresh}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
evar_is_fresh_in (fresh_evar phi) phi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
fresh: evar
H1: x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0fresh}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
evar_is_fresh_in fresh phi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
fresh: evar
H1: x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0fresh}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
size phi^{evar:0fresh} ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
fresh: evar
H1: x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0fresh}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
well_formed psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H1: x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
evar_is_fresh_in (fresh_evar phi) phi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H1: x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
evar_is_fresh_in fresh phi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
H1: x ∈ eval (update_evar_val fresh c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0fresh}
size phi^{evar:0fresh} ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
H1: x ∈ eval (update_evar_val fresh c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0fresh}
well_formed psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)
size phi^{svar:0↦MuZ} ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)
well_formed psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)
well_formed_closed phi^{svar:0↦MuZ}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)
size phi^{svar:0↦MuZ} ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)
well_formed psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi

evar_is_fresh_in (fresh_evar phi) phi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi
evar_is_fresh_in fresh phi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi
H: x ∈ eval (update_evar_val fresh c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0fresh}
size phi^{evar:0fresh} ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi
H: x ∈ eval (update_evar_val fresh c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0fresh}
well_formed psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
fresh: evar
H1: x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0fresh}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
evar_is_fresh_in (fresh_evar phi) phi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
fresh: evar
H1: x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0fresh}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
evar_is_fresh_in fresh phi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
fresh: evar
H1: x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0fresh}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
size phi^{evar:0fresh} ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
fresh: evar
H1: x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0fresh}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
well_formed psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H1: x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
evar_is_fresh_in (fresh_evar phi) phi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H1: x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
evar_is_fresh_in fresh phi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
H1: x ∈ eval (update_evar_val fresh c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0fresh}
size phi^{evar:0fresh} ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
H1: x ∈ eval (update_evar_val fresh c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0fresh}
well_formed psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)
size phi^{svar:0↦MuZ} ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)
well_formed psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)
well_formed_closed phi^{svar:0↦MuZ}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)
size phi^{svar:0↦MuZ} ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)
well_formed psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi

evar_is_fresh_in fresh phi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi
H: x ∈ eval (update_evar_val fresh c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0fresh}
size phi^{evar:0fresh} ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi
H: x ∈ eval (update_evar_val fresh c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0fresh}
well_formed psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
fresh: evar
H1: x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0fresh}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
evar_is_fresh_in (fresh_evar phi) phi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
fresh: evar
H1: x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0fresh}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
evar_is_fresh_in fresh phi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
fresh: evar
H1: x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0fresh}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
size phi^{evar:0fresh} ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
fresh: evar
H1: x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0fresh}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
well_formed psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H1: x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
evar_is_fresh_in (fresh_evar phi) phi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H1: x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
evar_is_fresh_in fresh phi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
H1: x ∈ eval (update_evar_val fresh c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0fresh}
size phi^{evar:0fresh} ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
H1: x ∈ eval (update_evar_val fresh c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0fresh}
well_formed psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)
size phi^{svar:0↦MuZ} ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)
well_formed psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)
well_formed_closed phi^{svar:0↦MuZ}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)
size phi^{svar:0↦MuZ} ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)
well_formed psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi
H: x ∈ eval (update_evar_val fresh c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0fresh}

size phi^{evar:0fresh} ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi
H: x ∈ eval (update_evar_val fresh c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0fresh}
well_formed psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
fresh: evar
H1: x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0fresh}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
evar_is_fresh_in (fresh_evar phi) phi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
fresh: evar
H1: x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0fresh}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
evar_is_fresh_in fresh phi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
fresh: evar
H1: x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0fresh}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
size phi^{evar:0fresh} ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
fresh: evar
H1: x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0fresh}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
well_formed psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H1: x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
evar_is_fresh_in (fresh_evar phi) phi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H1: x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
evar_is_fresh_in fresh phi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
H1: x ∈ eval (update_evar_val fresh c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0fresh}
size phi^{evar:0fresh} ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
H1: x ∈ eval (update_evar_val fresh c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0fresh}
well_formed psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)
size phi^{svar:0↦MuZ} ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)
well_formed psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)
well_formed_closed phi^{svar:0↦MuZ}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)
size phi^{svar:0↦MuZ} ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)
well_formed psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi
H: x ∈ eval (update_evar_val fresh c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0fresh}

size phi^{evar:0fresh} ≤ sz
signature: Signature
M: Model
phi: Pattern
IHsz: (phi0 psi : Pattern) (X : svar) (ρ : Valuation), size phi0 ≤ size phi → well_formed psi → well_formed_closed phi0 → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi0) = eval (update_svar_val X (eval ρ psi) ρ) phi0
psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S (size phi)
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
c, x: M
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi
H: x ∈ eval (update_evar_val fresh c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0fresh}

size phi^{evar:0fresh} ≤ size phi
signature: Signature
M: Model
phi: Pattern
IHsz: (phi0 psi : Pattern) (X : svar) (ρ : Valuation), size phi0 ≤ size phi → well_formed psi → well_formed_closed phi0 → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi0) = eval (update_svar_val X (eval ρ psi) ρ) phi0
psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S (size phi)
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
c, x: M
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi
H: x ∈ eval (update_evar_val fresh c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0fresh}

size phi ≤ size phi
reflexivity.
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
H0: size phi = sz
c, x: M
H1: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H2: fresh ∉ free_evars phi^[[svar:X↦psi]]
H4: fresh ∉ free_evars phi
H3: fresh ∉ free_evars psi
H5: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H6: evar_is_fresh_in fresh phi
H7: evar_is_fresh_in (fresh_evar phi) phi
H: x ∈ eval (update_evar_val fresh c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0fresh}

well_formed psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
fresh: evar
H1: x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0fresh}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
evar_is_fresh_in (fresh_evar phi) phi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
fresh: evar
H1: x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0fresh}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
evar_is_fresh_in fresh phi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
fresh: evar
H1: x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0fresh}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
size phi^{evar:0fresh} ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
fresh: evar
H1: x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0fresh}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
well_formed psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H1: x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
evar_is_fresh_in (fresh_evar phi) phi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H1: x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
evar_is_fresh_in fresh phi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
H1: x ∈ eval (update_evar_val fresh c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0fresh}
size phi^{evar:0fresh} ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
H1: x ∈ eval (update_evar_val fresh c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0fresh}
well_formed psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)
size phi^{svar:0↦MuZ} ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)
well_formed psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)
well_formed_closed phi^{svar:0↦MuZ}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)
size phi^{svar:0↦MuZ} ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)
well_formed psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
fresh: evar
H1: x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0fresh}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi

evar_is_fresh_in (fresh_evar phi) phi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
fresh: evar
H1: x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0fresh}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
evar_is_fresh_in fresh phi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
fresh: evar
H1: x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0fresh}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
size phi^{evar:0fresh} ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
fresh: evar
H1: x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0fresh}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
well_formed psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H1: x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
evar_is_fresh_in (fresh_evar phi) phi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H1: x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
evar_is_fresh_in fresh phi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
H1: x ∈ eval (update_evar_val fresh c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0fresh}
size phi^{evar:0fresh} ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
H1: x ∈ eval (update_evar_val fresh c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0fresh}
well_formed psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)
size phi^{svar:0↦MuZ} ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)
well_formed psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)
well_formed_closed phi^{svar:0↦MuZ}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)
size phi^{svar:0↦MuZ} ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)
well_formed psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
fresh: evar
H1: x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0fresh}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi

evar_is_fresh_in fresh phi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
fresh: evar
H1: x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0fresh}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
size phi^{evar:0fresh} ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
fresh: evar
H1: x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0fresh}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
well_formed psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H1: x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
evar_is_fresh_in (fresh_evar phi) phi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H1: x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
evar_is_fresh_in fresh phi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
H1: x ∈ eval (update_evar_val fresh c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0fresh}
size phi^{evar:0fresh} ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
H1: x ∈ eval (update_evar_val fresh c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0fresh}
well_formed psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)
size phi^{svar:0↦MuZ} ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)
well_formed psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)
well_formed_closed phi^{svar:0↦MuZ}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)
size phi^{svar:0↦MuZ} ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)
well_formed psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
fresh: evar
H1: x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0fresh}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi

size phi^{evar:0fresh} ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
fresh: evar
H1: x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0fresh}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
well_formed psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H1: x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
evar_is_fresh_in (fresh_evar phi) phi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H1: x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
evar_is_fresh_in fresh phi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
H1: x ∈ eval (update_evar_val fresh c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0fresh}
size phi^{evar:0fresh} ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
H1: x ∈ eval (update_evar_val fresh c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0fresh}
well_formed psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)
size phi^{svar:0↦MuZ} ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)
well_formed psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)
well_formed_closed phi^{svar:0↦MuZ}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)
size phi^{svar:0↦MuZ} ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)
well_formed psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
fresh: evar
H1: x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0fresh}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi

size phi^{evar:0fresh} ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
fresh: evar
H1: x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0fresh}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi

size phi ≤ sz
lia.
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
fresh: evar
H1: x ∈ eval (update_evar_val fresh c ρ) ((fix free_svar_subst (psi : Pattern) (X : svar) (phi : Pattern) {struct phi} : Pattern := match phi with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X = X') then psi else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi X phi1 $ free_svar_subst psi X phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi X phi1 ---> free_svar_subst psi X phi2 | ex , phi' => ex , free_svar_subst psi X phi' | mu , phi' => mu , free_svar_subst psi X phi' end) psi X phi)^{evar:0fresh}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi

well_formed psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H1: x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
evar_is_fresh_in (fresh_evar phi) phi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H1: x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
evar_is_fresh_in fresh phi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
H1: x ∈ eval (update_evar_val fresh c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0fresh}
size phi^{evar:0fresh} ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
H1: x ∈ eval (update_evar_val fresh c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0fresh}
well_formed psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)
size phi^{svar:0↦MuZ} ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)
well_formed psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)
well_formed_closed phi^{svar:0↦MuZ}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)
size phi^{svar:0↦MuZ} ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)
well_formed psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H1: x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi

evar_is_fresh_in (fresh_evar phi) phi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H1: x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
evar_is_fresh_in fresh phi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
H1: x ∈ eval (update_evar_val fresh c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0fresh}
size phi^{evar:0fresh} ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
H1: x ∈ eval (update_evar_val fresh c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0fresh}
well_formed psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)
size phi^{svar:0↦MuZ} ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)
well_formed psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)
well_formed_closed phi^{svar:0↦MuZ}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)
size phi^{svar:0↦MuZ} ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)
well_formed psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H1: x ∈ eval (update_evar_val (fresh_evar phi) c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0↦fresh_evar phi}
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi

evar_is_fresh_in fresh phi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
H1: x ∈ eval (update_evar_val fresh c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0fresh}
size phi^{evar:0fresh} ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
H1: x ∈ eval (update_evar_val fresh c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0fresh}
well_formed psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)
size phi^{svar:0↦MuZ} ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)
well_formed psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)
well_formed_closed phi^{svar:0↦MuZ}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)
size phi^{svar:0↦MuZ} ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)
well_formed psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
H1: x ∈ eval (update_evar_val fresh c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0fresh}

size phi^{evar:0fresh} ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
H1: x ∈ eval (update_evar_val fresh c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0fresh}
well_formed psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)
size phi^{svar:0↦MuZ} ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)
well_formed psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)
well_formed_closed phi^{svar:0↦MuZ}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)
size phi^{svar:0↦MuZ} ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)
well_formed psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
H1: x ∈ eval (update_evar_val fresh c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0fresh}

size phi^{evar:0fresh} ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
H1: x ∈ eval (update_evar_val fresh c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0fresh}

size phi ≤ sz
lia.
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ ((fix free_svar_subst (psi0 : Pattern) (X0 : svar) (phi0 : Pattern) {struct phi0} : Pattern := match phi0 with | patt_free_evar x => patt_free_evar x | patt_free_svar X' => if decide (X0 = X') then psi0 else patt_free_svar X' | patt_bound_evar x => patt_bound_evar x | patt_bound_svar X' => patt_bound_svar X' | patt_sym sigma => patt_sym sigma | phi1 $ phi2 => free_svar_subst psi0 X0 phi1 $ free_svar_subst psi0 X0 phi2 | ⊥ => ⊥ | phi1 ---> phi2 => free_svar_subst psi0 X0 phi1 ---> free_svar_subst psi0 X0 phi2 | ex , phi' => ex , free_svar_subst psi0 X0 phi' | mu , phi' => mu , free_svar_subst psi0 X0 phi' end) psi X phi) = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (ex , phi)
m: nat
H0: S (size phi) ≤ sz
H: m = sz
c, x: M
H2: evar_is_fresh_in (fresh_evar phi^[[svar:X↦psi]]) phi^[[svar:X↦psi]]
B: EVarSet
HeqB: B = free_evars phi^[[svar:X↦psi]] ∪ free_evars phi ∪ free_evars psi
fresh: evar
Heqfresh: fresh = evar_fresh (elements B)
H3: fresh ∉ free_evars phi^[[svar:X↦psi]]
H5: fresh ∉ free_evars phi
H4: fresh ∉ free_evars psi
H6: evar_is_fresh_in fresh phi^[[svar:X↦psi]]
H7: evar_is_fresh_in fresh phi
H8: evar_is_fresh_in (fresh_evar phi) phi
H1: x ∈ eval (update_evar_val fresh c (update_svar_val X (eval ρ psi) ρ)) phi^{evar:0fresh}

well_formed psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)
size phi^{svar:0↦MuZ} ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)
well_formed psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)
well_formed_closed phi^{svar:0↦MuZ}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)
size phi^{svar:0↦MuZ} ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)
well_formed psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)

size phi^{svar:0↦MuZ} ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)
well_formed psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)
well_formed_closed phi^{svar:0↦MuZ}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)
size phi^{svar:0↦MuZ} ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)
well_formed psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)

size phi^{svar:0↦MuZ} ≤ sz
signature: Signature
M: Model
phi: Pattern
IHsz: (phi0 psi : Pattern) (X : svar) (ρ : Valuation), size phi0 ≤ size phi → well_formed psi → well_formed_closed phi0 → eval ρ phi0^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi0
psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S (size phi)
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)

size phi^{svar:0↦MuZ} ≤ size phi
signature: Signature
M: Model
phi: Pattern
IHsz: (phi0 psi : Pattern) (X : svar) (ρ : Valuation), size phi0 ≤ size phi → well_formed psi → well_formed_closed phi0 → eval ρ phi0^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi0
psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S (size phi)
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)

size phi ≤ size phi
reflexivity.
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)

well_formed psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)
well_formed_closed phi^{svar:0↦MuZ}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)
size phi^{svar:0↦MuZ} ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)
well_formed psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)

well_formed_closed phi^{svar:0↦MuZ}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)
size phi^{svar:0↦MuZ} ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)
well_formed psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc: well_formed_closed (mu , phi)
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)

well_formed_closed phi^{svar:0↦MuZ}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc1: well_formed_closed_mu_aux (mu , phi) 0 = true
Hwfc2: well_formed_closed_ex_aux (mu , phi) 0 = true
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)

well_formed_closed phi^{svar:0↦MuZ}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc1: well_formed_closed_mu_aux phi 1 = true
Hwfc2: well_formed_closed_ex_aux phi 0 = true
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)

well_formed_closed phi^{svar:0↦MuZ}
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc1: well_formed_closed_mu_aux phi 1 = true
Hwfc2: well_formed_closed_ex_aux phi 0 = true
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)

well_formed_closed_mu_aux phi^{svar:0↦MuZ} 0 = true ∧ well_formed_closed_ex_aux phi^{svar:0↦MuZ} 0 = true
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc1: well_formed_closed_mu_aux phi 1 = true
Hwfc2: well_formed_closed_ex_aux phi 0 = true
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)

well_formed_closed_mu_aux phi^{svar:0↦MuZ} 0 = true
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc1: well_formed_closed_mu_aux phi 1 = true
Hwfc2: well_formed_closed_ex_aux phi 0 = true
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)
well_formed_closed_ex_aux phi^{svar:0↦MuZ} 0 = true
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc1: well_formed_closed_mu_aux phi 1 = true
Hwfc2: well_formed_closed_ex_aux phi 0 = true
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)

well_formed_closed_mu_aux phi^{svar:0↦MuZ} 0 = true
now apply wfc_mu_aux_body_mu_imp1.
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
Hwfc1: well_formed_closed_mu_aux phi 1 = true
Hwfc2: well_formed_closed_ex_aux phi 0 = true
H0: size phi = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H: MuZ ∉ free_svars phi
H3: MuZ ∉ free_svars psi
H2: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars (patt_free_svar X)

well_formed_closed_ex_aux phi^{svar:0↦MuZ} 0 = true
now apply wfc_ex_aux_body_mu_imp1.
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)

size phi^{svar:0↦MuZ} ≤ sz
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)
well_formed psi
signature: Signature
M: Model
m: nat
phi: Pattern
H0: S (size phi) ≤ m
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ m → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S m
Hwf: well_formed psi
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)

size phi^{svar:0↦MuZ} ≤ m
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)
well_formed psi
signature: Signature
M: Model
m: nat
phi: Pattern
H0: S (size phi) ≤ m
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ m → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S m
Hwf: well_formed psi
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)

size phi ≤ m
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)
well_formed psi
signature: Signature
M: Model
sz: nat
IHsz: (phi psi : Pattern) (X : svar) (ρ : Valuation), size phi ≤ sz → well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
phi, psi: Pattern
X: svar
ρ: Valuation
Hsz: S (size phi) ≤ S sz
Hwf: well_formed psi
m: nat
H0: S (size phi) ≤ sz
H: m = sz
x: propset M
MuZ: svar
HeqMuZ: MuZ = svar_fresh (elements (free_svars phi ∪ free_svars psi ∪ free_svars phi^[[svar:X↦psi]] ∪ free_svars (patt_free_svar X)))
MuX: svar
HeqMuX: MuX = fresh_svar phi
MuY: svar
HeqMuY: MuY = fresh_svar phi^[[svar:X↦psi]]
H1: MuZ ∉ free_svars phi
H4: MuZ ∉ free_svars psi
H3: MuZ ∉ free_svars phi^[[svar:X↦psi]]
H2: MuZ ∉ free_svars (patt_free_svar X)

well_formed psi
assumption. Qed.
signature: Signature
M: Model

(phi psi : Pattern) (X : svar) (ρ : Valuation), well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
signature: Signature
M: Model

(phi psi : Pattern) (X : svar) (ρ : Valuation), well_formed psi → well_formed_closed phi → eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
signature: Signature
M: Model
phi, psi: Pattern
X: svar
ρ: Valuation
H: well_formed psi
H0: well_formed_closed phi

eval ρ phi^[[svar:X↦psi]] = eval (update_svar_val X (eval ρ psi) ρ) phi
signature: Signature
M: Model
phi, psi: Pattern
X: svar
ρ: Valuation
H: well_formed psi
H0: well_formed_closed phi

size phi ≤ size phi
signature: Signature
M: Model
phi, psi: Pattern
X: svar
ρ: Valuation
H: well_formed psi
H0: well_formed_closed phi
well_formed psi
signature: Signature
M: Model
phi, psi: Pattern
X: svar
ρ: Valuation
H: well_formed psi
H0: well_formed_closed phi
well_formed_closed phi
signature: Signature
M: Model
phi, psi: Pattern
X: svar
ρ: Valuation
H: well_formed psi
H0: well_formed_closed phi

well_formed psi
signature: Signature
M: Model
phi, psi: Pattern
X: svar
ρ: Valuation
H: well_formed psi
H0: well_formed_closed phi
well_formed_closed phi
signature: Signature
M: Model
phi, psi: Pattern
X: svar
ρ: Valuation
H: well_formed psi
H0: well_formed_closed phi

well_formed_closed phi
assumption. Qed. (* rho(psi) = empty then C[rho(psi)] = empty *)
signature: Signature
M: Model
psi: Pattern
ρ: Valuation
C: Application_context

eval ρ psi = ∅ → eval ρ (subst_ctx C psi) = ∅
signature: Signature
M: Model
psi: Pattern
ρ: Valuation
C: Application_context

eval ρ psi = ∅ → eval ρ (subst_ctx C psi) = ∅
signature: Signature
M: Model
psi: Pattern
ρ: Valuation
C: Application_context
Hpsi: eval ρ psi = ∅

eval ρ (subst_ctx C psi) = ∅
signature: Signature
M: Model
psi: Pattern
ρ: Valuation
Hpsi: eval ρ psi = ∅

eval ρ (subst_ctx box psi) = ∅
signature: Signature
M: Model
psi: Pattern
ρ: Valuation
C: Application_context
p: Pattern
Prf: well_formed p
Hpsi: eval ρ psi = ∅
IHC: eval ρ (subst_ctx C psi) = ∅
eval ρ (subst_ctx (ctx_app_l C p Prf) psi) = ∅
signature: Signature
M: Model
psi: Pattern
ρ: Valuation
p: Pattern
C: Application_context
Prf: well_formed p
Hpsi: eval ρ psi = ∅
IHC: eval ρ (subst_ctx C psi) = ∅
eval ρ (subst_ctx (ctx_app_r p C Prf) psi) = ∅
signature: Signature
M: Model
psi: Pattern
ρ: Valuation
Hpsi: eval ρ psi = ∅

eval ρ (subst_ctx box psi) = ∅
auto.
signature: Signature
M: Model
psi: Pattern
ρ: Valuation
C: Application_context
p: Pattern
Prf: well_formed p
Hpsi: eval ρ psi = ∅
IHC: eval ρ (subst_ctx C psi) = ∅

eval ρ (subst_ctx (ctx_app_l C p Prf) psi) = ∅
signature: Signature
M: Model
psi: Pattern
ρ: Valuation
C: Application_context
p: Pattern
Prf: well_formed p
Hpsi: eval ρ psi = ∅
IHC: eval ρ (subst_ctx C psi) = ∅

eval ρ (subst_ctx C psi $ p) = ∅
signature: Signature
M: Model
psi: Pattern
ρ: Valuation
C: Application_context
p: Pattern
Prf: well_formed p
Hpsi: eval ρ psi = ∅
IHC: eval ρ (subst_ctx C psi) = ∅

app_ext (eval ρ (subst_ctx C psi)) (eval ρ p) = ∅
signature: Signature
M: Model
psi: Pattern
ρ: Valuation
C: Application_context
p: Pattern
Prf: well_formed p
Hpsi: eval ρ psi = ∅
IHC: eval ρ (subst_ctx C psi) = ∅

app_ext ∅ (eval ρ p) = ∅
apply app_ext_bot_l.
signature: Signature
M: Model
psi: Pattern
ρ: Valuation
p: Pattern
C: Application_context
Prf: well_formed p
Hpsi: eval ρ psi = ∅
IHC: eval ρ (subst_ctx C psi) = ∅

eval ρ (subst_ctx (ctx_app_r p C Prf) psi) = ∅
signature: Signature
M: Model
psi: Pattern
ρ: Valuation
p: Pattern
C: Application_context
Prf: well_formed p
Hpsi: eval ρ psi = ∅
IHC: eval ρ (subst_ctx C psi) = ∅

eval ρ (p $ subst_ctx C psi) = ∅
signature: Signature
M: Model
psi: Pattern
ρ: Valuation
p: Pattern
C: Application_context
Prf: well_formed p
Hpsi: eval ρ psi = ∅
IHC: eval ρ (subst_ctx C psi) = ∅

app_ext (eval ρ p) (eval ρ (subst_ctx C psi)) = ∅
signature: Signature
M: Model
psi: Pattern
ρ: Valuation
p: Pattern
C: Application_context
Prf: well_formed p
Hpsi: eval ρ psi = ∅
IHC: eval ρ (subst_ctx C psi) = ∅

app_ext (eval ρ p) ∅ = ∅
apply app_ext_bot_r. Qed. (* application to a singleton *) Definition rel_of ρ ϕ: Domain M -> propset (Domain M) := λ m₁, (app_ext (@eval M ρ ϕ) {[ m₁ ]}). Definition is_total_function f (d c : propset (Domain M)) ρ := (m₁ : Domain M), m₁ ∈ d -> (m₂ : Domain M), m₂ ∈ c /\ app_ext (@eval M ρ f) {[ m₁ ]} = {[ m₂ ]}. Definition total_function_is_injective f (d : propset (Domain M)) ρ := (m₁ : Domain M), m₁ ∈ d -> (m₂ : Domain M), m₂ ∈ d -> (rel_of ρ f) m₁ = (rel_of ρ f) m₂ -> m₁ = m₂. Definition is_functional_pattern ϕ ρ := (m : Domain M), @eval M ρ ϕ = {[ m ]}.
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation
m₁, m₂: M

is_functional_pattern ϕ ρ → m₁ ∈ eval ρ ϕ → m₂ ∈ eval ρ ϕ → m₁ = m₂
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation
m₁, m₂: M

is_functional_pattern ϕ ρ → m₁ ∈ eval ρ ϕ → m₂ ∈ eval ρ ϕ → m₁ = m₂
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation
m₁, m₂, m: M
Hm: eval ρ ϕ = {[m]}
Hm₁: m₁ ∈ eval ρ ϕ
Hm₂: m₂ ∈ eval ρ ϕ

m₁ = m₂
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation
m₁, m₂, m: M
Hm: eval ρ ϕ = {[m]}
Hm₂: m₂ ∈ eval ρ ϕ
Hm₁: m₁ ∈ {[m]}

m₁ = m₂
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation
m₁, m₂, m: M
Hm: eval ρ ϕ = {[m]}
Hm₂: m₂ ∈ eval ρ ϕ
Hm₁: m₁ ∈ {[m]}
H: m = m₁

m₁ = m₂
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation
m₁, m₂: M
Hm: eval ρ ϕ = {[m₁]}
Hm₂: m₂ ∈ eval ρ ϕ
Hm₁: m₁ ∈ {[m₁]}

m₁ = m₂
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation
m₁, m₂: M
Hm: eval ρ ϕ = {[m₁]}
Hm₂: m₂ ∈ eval ρ ϕ

m₁ = m₂
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation
m₁, m₂: M
Hm: eval ρ ϕ = {[m₁]}
Hm₂: m₂ ∈ {[m₁]}

m₁ = m₂
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation
m₁, m₂: M
Hm: eval ρ ϕ = {[m₁]}
Hm₂: m₂ ∈ {[m₁]}
H: m₁ = m₂

m₂ = m₂
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation
m₂: M
Hm₂: m₂ ∈ {[m₂]}
Hm: eval ρ ϕ = {[m₂]}

m₂ = m₂
signature: Signature
M: Model
ϕ: Pattern
ρ: Valuation
m₂: M
Hm: eval ρ ϕ = {[m₂]}

m₂ = m₂
reflexivity. Qed. End with_model. End semantics. Module Notations. Notation "M ⊨ᴹ phi" := (satisfies_model M phi) (left associativity, at level 50) : ml_scope. (* FIXME this should not be called `satisfies` *) Notation "G ⊨ phi" := (satisfies G phi) (left associativity, at level 50) : ml_scope. Notation "M ⊨ᵀ Gamma" := (satisfies_theory M Gamma) (left associativity, at level 50) : ml_scope. End Notations. (*Module Hints.*) #[export] Hint Resolve M_predicate_impl : core. #[export] Hint Resolve M_predicate_bott : core. #[export] Hint Resolve M_predicate_exists : core. #[export] Hint Extern 4 (M_predicate _ (evar_open _ _ _)) => mlSimpl : core. #[export] Hint Extern 4 (T_predicate _ (evar_open _ _ _)) => mlSimpl : core. #[export] Hint Extern 4 (M_predicate _ (svar_open _ _ _)) => mlSimpl : core. #[export] Hint Extern 4 (T_predicate _ (svar_open _ _ _)) => mlSimpl : core. #[export] Hint Resolve T_predicate_impl_M_predicate : core. #[export] Hint Resolve T_predicate_impl : core. #[export] Hint Resolve T_predicate_bot : core. (*End Hints.*)
Σ: Signature
M: Model

Proper (equiv ==> equiv ==> equiv) app_ext
Σ: Signature
M: Model

Proper (equiv ==> equiv ==> equiv) app_ext
Σ: Signature
M: Model
X, X': propset M
HXX': X ≡ X'
Y, Y': propset M
HYY': Y ≡ Y'

app_ext X Y ≡ app_ext X' Y'
Σ: Signature
M: Model
X, X': propset M
HXX': X ≡ X'
Y, Y': propset M
HYY': Y ≡ Y'

{[ e | le re : M, le ∈ X ∧ re ∈ Y ∧ e ∈ app_interp M le re ]} ≡ {[ e | le re : M, le ∈ X' ∧ re ∈ Y' ∧ e ∈ app_interp M le re ]}
Σ: Signature
M: Model
X, X': propset M
HXX': X ≡ X'
Y, Y': propset M
HYY': Y ≡ Y'

{[ e | le re : M, le ∈ X ∧ re ∈ Y ∧ e ∈ app_interp M le re ]} ⊆ {[ e | le re : M, le ∈ X' ∧ re ∈ Y' ∧ e ∈ app_interp M le re ]} ⊆ {[ e | le re : M, le ∈ X ∧ re ∈ Y ∧ e ∈ app_interp M le re ]}
Σ: Signature
M: Model
X, X': propset M
HXX': X ≡ X'
Y, Y': propset M
HYY': Y ≡ Y'

{[ e | le re : M, le ∈ X ∧ re ∈ Y ∧ e ∈ app_interp M le re ]} ⊆ {[ e | le re : M, le ∈ X' ∧ re ∈ Y' ∧ e ∈ app_interp M le re ]}
Σ: Signature
M: Model
X, X': propset M
HXX': X ≡ X'
Y, Y': propset M
HYY': Y ≡ Y'
{[ e | le re : M, le ∈ X' ∧ re ∈ Y' ∧ e ∈ app_interp M le re ]} ⊆ {[ e | le re : M, le ∈ X ∧ re ∈ Y ∧ e ∈ app_interp M le re ]}
Σ: Signature
M: Model
X, X': propset M
HXX': X ≡ X'
Y, Y': propset M
HYY': Y ≡ Y'

{[ e | le re : M, le ∈ X ∧ re ∈ Y ∧ e ∈ app_interp M le re ]} ⊆ {[ e | le re : M, le ∈ X' ∧ re ∈ Y' ∧ e ∈ app_interp M le re ]}
Σ: Signature
M: Model
X, X': propset M
HXX': X ≡ X'
Y, Y': propset M
HYY': Y ≡ Y'

x : M, x ∈ {[ e | le re : M, le ∈ X ∧ re ∈ Y ∧ e ∈ app_interp M le re ]} → x ∈ {[ e | le re : M, le ∈ X' ∧ re ∈ Y' ∧ e ∈ app_interp M le re ]}
Σ: Signature
M: Model
X, X': propset M
HXX': X ≡ X'
Y, Y': propset M
HYY': Y ≡ Y'
x: M
Hx: x ∈ {[ e | le re : M, le ∈ X ∧ re ∈ Y ∧ e ∈ app_interp M le re ]}

x ∈ {[ e | le re : M, le ∈ X' ∧ re ∈ Y' ∧ e ∈ app_interp M le re ]}
Σ: Signature
M: Model
X, X': propset M
HXX': X ≡ X'
Y, Y': propset M
HYY': Y ≡ Y'
x: M
Hx: le re : M, le ∈ X ∧ re ∈ Y ∧ x ∈ app_interp M le re

x ∈ {[ e | le re : M, le ∈ X' ∧ re ∈ Y' ∧ e ∈ app_interp M le re ]}
Σ: Signature
M: Model
X, X': propset M
HXX': X ≡ X'
Y, Y': propset M
HYY': Y ≡ Y'
x: M
Hx: le re : M, le ∈ X ∧ re ∈ Y ∧ x ∈ app_interp M le re

le re : M, le ∈ X' ∧ re ∈ Y' ∧ x ∈ app_interp M le re
Σ: Signature
M: Model
X, X': propset M
HXX': X ≡ X'
Y, Y': propset M
HYY': Y ≡ Y'
x, le, re: M
Hle: le ∈ X
Hre: re ∈ Y
Hx: x ∈ app_interp M le re

le re : M, le ∈ X' ∧ re ∈ Y' ∧ x ∈ app_interp M le re
Σ: Signature
M: Model
X, X': propset M
HXX': X ≡ X'
Y, Y': propset M
HYY': Y ≡ Y'
x, le, re: M
Hle: le ∈ X
Hre: re ∈ Y
Hx: x ∈ app_interp M le re

re : M, le ∈ X' ∧ re ∈ Y' ∧ x ∈ app_interp M le re
Σ: Signature
M: Model
X, X': propset M
HXX': X ≡ X'
Y, Y': propset M
HYY': Y ≡ Y'
x, le, re: M
Hle: le ∈ X
Hre: re ∈ Y
Hx: x ∈ app_interp M le re

le ∈ X' ∧ re ∈ Y' ∧ x ∈ app_interp M le re
Σ: Signature
M: Model
X, X': propset M
HXX': X ≡ X'
Y, Y': propset M
HYY': Y ≡ Y'
x, le, re: M
Hle: le ∈ X
Hre: re ∈ Y
Hx: x ∈ app_interp M le re

le ∈ X'
Σ: Signature
M: Model
X, X': propset M
HXX': X ≡ X'
Y, Y': propset M
HYY': Y ≡ Y'
x, le, re: M
Hle: le ∈ X
Hre: re ∈ Y
Hx: x ∈ app_interp M le re
re ∈ Y' ∧ x ∈ app_interp M le re
Σ: Signature
M: Model
X, X': propset M
HXX': X ≡ X'
Y, Y': propset M
HYY': Y ≡ Y'
x, le, re: M
Hle: le ∈ X
Hre: re ∈ Y
Hx: x ∈ app_interp M le re

le ∈ X'
Σ: Signature
M: Model
X, X': propset M
HXX': X ≡ X'
Y, Y': propset M
HYY': Y ≡ Y'
x, le, re: M
Hle: le ∈ X
Hre: re ∈ Y
Hx: x ∈ app_interp M le re

le ∈ X
assumption.
Σ: Signature
M: Model
X, X': propset M
HXX': X ≡ X'
Y, Y': propset M
HYY': Y ≡ Y'
x, le, re: M
Hle: le ∈ X
Hre: re ∈ Y
Hx: x ∈ app_interp M le re

re ∈ Y' ∧ x ∈ app_interp M le re
Σ: Signature
M: Model
X, X': propset M
HXX': X ≡ X'
Y, Y': propset M
HYY': Y ≡ Y'
x, le, re: M
Hle: le ∈ X
Hre: re ∈ Y
Hx: x ∈ app_interp M le re

re ∈ Y'
Σ: Signature
M: Model
X, X': propset M
HXX': X ≡ X'
Y, Y': propset M
HYY': Y ≡ Y'
x, le, re: M
Hle: le ∈ X
Hre: re ∈ Y
Hx: x ∈ app_interp M le re
x ∈ app_interp M le re
Σ: Signature
M: Model
X, X': propset M
HXX': X ≡ X'
Y, Y': propset M
HYY': Y ≡ Y'
x, le, re: M
Hle: le ∈ X
Hre: re ∈ Y
Hx: x ∈ app_interp M le re

re ∈ Y'
Σ: Signature
M: Model
X, X': propset M
HXX': X ≡ X'
Y, Y': propset M
HYY': Y ≡ Y'
x, le, re: M
Hle: le ∈ X
Hre: re ∈ Y
Hx: x ∈ app_interp M le re

re ∈ Y
assumption.
Σ: Signature
M: Model
X, X': propset M
HXX': X ≡ X'
Y, Y': propset M
HYY': Y ≡ Y'
x, le, re: M
Hle: le ∈ X
Hre: re ∈ Y
Hx: x ∈ app_interp M le re

x ∈ app_interp M le re
assumption.
Σ: Signature
M: Model
X, X': propset M
HXX': X ≡ X'
Y, Y': propset M
HYY': Y ≡ Y'

{[ e | le re : M, le ∈ X' ∧ re ∈ Y' ∧ e ∈ app_interp M le re ]} ⊆ {[ e | le re : M, le ∈ X ∧ re ∈ Y ∧ e ∈ app_interp M le re ]}
Σ: Signature
M: Model
X, X': propset M
HXX': X ≡ X'
Y, Y': propset M
HYY': Y ≡ Y'

{[ e | le re : M, le ∈ X' ∧ re ∈ Y' ∧ e ∈ app_interp M le re ]} ⊆ {[ e | le re : M, le ∈ X ∧ re ∈ Y ∧ e ∈ app_interp M le re ]}
Σ: Signature
M: Model
X, X': propset M
HXX': X ≡ X'
Y, Y': propset M
HYY': Y ≡ Y'

x : M, x ∈ {[ e | le re : M, le ∈ X' ∧ re ∈ Y' ∧ e ∈ app_interp M le re ]} → x ∈ {[ e | le re : M, le ∈ X ∧ re ∈ Y ∧ e ∈ app_interp M le re ]}
Σ: Signature
M: Model
X, X': propset M
HXX': X ≡ X'
Y, Y': propset M
HYY': Y ≡ Y'
x: M
Hx: x ∈ {[ e | le re : M, le ∈ X' ∧ re ∈ Y' ∧ e ∈ app_interp M le re ]}

x ∈ {[ e | le re : M, le ∈ X ∧ re ∈ Y ∧ e ∈ app_interp M le re ]}
Σ: Signature
M: Model
X, X': propset M
HXX': X ≡ X'
Y, Y': propset M
HYY': Y ≡ Y'
x: M
Hx: le re : M, le ∈ X' ∧ re ∈ Y' ∧ x ∈ app_interp M le re

x ∈ {[ e | le re : M, le ∈ X ∧ re ∈ Y ∧ e ∈ app_interp M le re ]}
Σ: Signature
M: Model
X, X': propset M
HXX': X ≡ X'
Y, Y': propset M
HYY': Y ≡ Y'
x: M
Hx: le re : M, le ∈ X' ∧ re ∈ Y' ∧ x ∈ app_interp M le re

le re : M, le ∈ X ∧ re ∈ Y ∧ x ∈ app_interp M le re
Σ: Signature
M: Model
X, X': propset M
HXX': X ≡ X'
Y, Y': propset M
HYY': Y ≡ Y'
x, le, re: M
Hle: le ∈ X'
Hre: re ∈ Y'
Hx: x ∈ app_interp M le re

le re : M, le ∈ X ∧ re ∈ Y ∧ x ∈ app_interp M le re
Σ: Signature
M: Model
X, X': propset M
HXX': X ≡ X'
Y, Y': propset M
HYY': Y ≡ Y'
x, le, re: M
Hle: le ∈ X'
Hre: re ∈ Y'
Hx: x ∈ app_interp M le re

re : M, le ∈ X ∧ re ∈ Y ∧ x ∈ app_interp M le re
Σ: Signature
M: Model
X, X': propset M
HXX': X ≡ X'
Y, Y': propset M
HYY': Y ≡ Y'
x, le, re: M
Hle: le ∈ X'
Hre: re ∈ Y'
Hx: x ∈ app_interp M le re

le ∈ X ∧ re ∈ Y ∧ x ∈ app_interp M le re
Σ: Signature
M: Model
X, X': propset M
HXX': X ≡ X'
Y, Y': propset M
HYY': Y ≡ Y'
x, le, re: M
Hle: le ∈ X'
Hre: re ∈ Y'
Hx: x ∈ app_interp M le re

le ∈ X
Σ: Signature
M: Model
X, X': propset M
HXX': X ≡ X'
Y, Y': propset M
HYY': Y ≡ Y'
x, le, re: M
Hle: le ∈ X'
Hre: re ∈ Y'
Hx: x ∈ app_interp M le re
re ∈ Y ∧ x ∈ app_interp M le re
Σ: Signature
M: Model
X, X': propset M
HXX': X ≡ X'
Y, Y': propset M
HYY': Y ≡ Y'
x, le, re: M
Hle: le ∈ X'
Hre: re ∈ Y'
Hx: x ∈ app_interp M le re

le ∈ X
Σ: Signature
M: Model
X, X': propset M
HXX': X ≡ X'
Y, Y': propset M
HYY': Y ≡ Y'
x, le, re: M
Hle: le ∈ X'
Hre: re ∈ Y'
Hx: x ∈ app_interp M le re

le ∈ X'
assumption.
Σ: Signature
M: Model
X, X': propset M
HXX': X ≡ X'
Y, Y': propset M
HYY': Y ≡ Y'
x, le, re: M
Hle: le ∈ X'
Hre: re ∈ Y'
Hx: x ∈ app_interp M le re

re ∈ Y ∧ x ∈ app_interp M le re
Σ: Signature
M: Model
X, X': propset M
HXX': X ≡ X'
Y, Y': propset M
HYY': Y ≡ Y'
x, le, re: M
Hle: le ∈ X'
Hre: re ∈ Y'
Hx: x ∈ app_interp M le re

re ∈ Y
Σ: Signature
M: Model
X, X': propset M
HXX': X ≡ X'
Y, Y': propset M
HYY': Y ≡ Y'
x, le, re: M
Hle: le ∈ X'
Hre: re ∈ Y'
Hx: x ∈ app_interp M le re
x ∈ app_interp M le re
Σ: Signature
M: Model
X, X': propset M
HXX': X ≡ X'
Y, Y': propset M
HYY': Y ≡ Y'
x, le, re: M
Hle: le ∈ X'
Hre: re ∈ Y'
Hx: x ∈ app_interp M le re

re ∈ Y
Σ: Signature
M: Model
X, X': propset M
HXX': X ≡ X'
Y, Y': propset M
HYY': Y ≡ Y'
x, le, re: M
Hle: le ∈ X'
Hre: re ∈ Y'
Hx: x ∈ app_interp M le re

re ∈ Y'
assumption.
Σ: Signature
M: Model
X, X': propset M
HXX': X ≡ X'
Y, Y': propset M
HYY': Y ≡ Y'
x, le, re: M
Hle: le ∈ X'
Hre: re ∈ Y'
Hx: x ∈ app_interp M le re

x ∈ app_interp M le re
assumption. } Qed.